ฐานข้อมูล Drupal innodb หรือ MyISAM?


10

ฉันมีเว็บไซต์ Drupal และฉันประสบปัญหาเรื่องประสิทธิภาพ ฉันพบฉันจะแปลงฐานข้อมูลจาก MyISAM เป็น InnoDB ได้อย่างไร ระบุว่าประสิทธิภาพอาจเพิ่มขึ้นโดยการสลับ

ฉันจะรู้ได้อย่างไรว่าฐานข้อมูล MySQL ของฉันคือ InnoDB หรือ MyISAM


1
ประเภทของตารางไม่ได้เชื่อมโยงกับแคตตาล็อก คุณสามารถมีแคตตาล็อกพร้อมส่วนผสมของ MyISAM และตาราง InnoDB ในนั้น
mpdonadio

2
ในขณะที่มีประโยชน์ในการปรับให้เหมาะสมในระดับนั้นฉันสงสัยอย่างมากว่าการเปลี่ยนประเภทตารางจะแก้ไขปัญหาด้านประสิทธิภาพของคุณ ความแตกต่างนั้นไม่ใหญ่มากนัก
Letharion

1
@Chris J. Lee นั่นถูกต้อง การผสมประเภทตารางสามารถใช้เพื่อเหตุผลด้านประสิทธิภาพหรือใช้ประโยชน์จากคุณลักษณะที่มีเฉพาะกับประเภทตารางเฉพาะ (เช่นการค้นหา FULLTEXT ที่มีตาราง MyISAM) นอกจากนี้ยังสามารถเกิดขึ้นโดยอุบัติเหตุถ้าคุณเปลี่ยนค่าเริ่มต้น mysqld และสร้างตารางอื่น ๆ ในแคตตาล็อก :)
mpdonadio

2
Letharion: นั่นไม่ถูกต้องธรรมดา ประเภทของตารางและวิธีการกำหนดค่า mysql สำหรับพวกเขามีผลกระทบอย่างมากต่อประสิทธิภาพ!
วอลเตอร์ Heck

2
@ Letharion: ในความเป็นจริงการละทิ้งการปรับปรุงสถาปัตยกรรมประสิทธิภาพที่สูงมากในกรณีของสิ่งต่าง ๆ เช่นการเกิดพร้อมกันกับ SELECT และ UPDATE ที่หลากหลาย - UPDATE จะล็อคตารางใน MyISAM แต่แถวเดียวใน InnoDB หมายความว่าการเพิ่มขึ้นอย่างมากสามารถทำได้ สามารถมองเห็นได้โดยไม่ต้องเปลี่ยนอะไรมากไปกว่าการเปลี่ยนเอนจิ้นของโต๊ะ ทีนี้ถ้าคุณทำคิวรี่โง่คุณก็จะเคียวรีโง่ ๆ และการเปลี่ยนประเภทตารางจะไม่ช่วยอะไร แต่การยกเลิกการเปลี่ยนเครื่องยนต์ออกจากมือนั้นไม่ถูกต้องเท่ากัน
BMDan

คำตอบ:


8

คุณสามารถเรียกใช้แบบสอบถามที่กำหนดเอง:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

เพื่อแสดงรายการตารางทั้งหมดในฐานข้อมูลของคุณและเอ็นจิ้นที่ใช้งานสำหรับแต่ละรายการ

หรือคุณสามารถเข้าสู่ฐานข้อมูลของคุณโดยใช้ phpMyAdmin และเลือกฐานข้อมูลของคุณ ... คุณจะเห็นเอ็นจินในTypeคอลัมน์ในรายการตาราง

โดยส่วนตัวฉันขอแนะนำNavicat สำหรับ MySQLเป็น MySQL GUI ที่ดีมากและทำให้การค้นหาสิ่งต่าง ๆ เช่นนี้ง่ายมาก

ที่มา: http://www.electrictoolbox.com/mysql-table-storage-engine/


เครื่องมือผู้ดูแลระบบ MySQL รุ่นเก่ายังทำงานได้ดีสำหรับสิ่งนี้ หากคุณโผล่บนเว็บไซต์ MySQL คุณยังสามารถหาโปรแกรมติดตั้งได้
mpdonadio

@MPD ว้าวยังคงเป็นเช่นนั้นใช่ไหม ต้องดาวน์โหลดที่แม้เพียงเล็กน้อยของความคิดถึง :)
ไคลฟ์

ผู้ดูแลระบบและเบราว์เซอร์แบบสอบถามเลิกใช้แล้วอย่างเป็นทางการและไม่สนับสนุนในขณะนี้ แต่คุณยังสามารถดาวน์โหลดได้ ฉันเกลียด Workbench และยังคงใช้สิ่งเหล่านี้
mpdonadio

หากต้องการดูผลลัพธ์ที่คล้ายกับสิ่งที่คุณเห็นใน phpMyAdmin SHOW TABLE STATUSที่บรรทัดคำสั่งการใช้งาน SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINEที่จะได้รับการนับที่เรียบง่ายของวิธีการหลายตารางอยู่ในประเภทเครื่องยนต์แต่ละมัน
BMDan

6

ประสบการณ์ที่ดีที่สุดของฉันคือการตัดสินใจต่อตาราง InnoDB เป็นสิ่งที่ดีเพราะสามารถหลีกเลี่ยงการล็อกตาราง (ไม่มีกระบวนการอื่นใดสามารถอ่านจากตารางในขณะที่กระบวนการหนึ่งเขียน) แต่มันทำงานได้อย่างยอดเยี่ยมด้วย COUNT () ซึ่งใช้บ่อยสำหรับการสอบถามเพจเจอร์

(แก้ไข: โปรดดูความคิดเห็นของ Clives ด้านล่าง)

นอกจากนี้ยังมีผลกระทบต่อการตั้งค่า MySQL ของคุณขึ้นอยู่กับฐานข้อมูลที่คุณใช้ หากคุณเข้าถึงเซิร์ฟเวอร์ mysqltuner ควรเป็นขั้นตอนแรกของคุณเพื่อตรวจสอบการกำหนดค่า:

https://github.com/rackerhacker/MySQLTuner-perl#readme


2
+1 ผมไม่ทราบ InnoDB ช้าสำหรับCOUNTคำสั่งตามบทความนี้โดยอดีตผู้จัดการกลุ่มที่มีประสิทธิภาพสูงสำหรับ MySQLแม้ว่ามันเท่านั้นจริงๆมีผลกระทบต่อการสืบค้นข้อมูลที่มีCOUNT(*) โดยไม่ต้องWHEREข้อ
ไคลฟ์

3
เหตุผลก็คือ MyISAM รักษาค่าต่อตารางสำหรับจำนวนแถวในตารางซึ่งหมายความว่าง่ายSELECT COUNT(*) FROM tableสามารถกลับทันทีด้วยค่าที่ InnoDB ไม่ดังนั้นจึงต้องสแกนดัชนีคีย์หลักทั้งหมด ที่กล่าวว่าในขณะที่ Drupal ทำหลายอย่างSELECT COUNT(*)ฉันก็นึกได้แค่ที่เดียวในรหัสทั้งหมดที่ทำได้โดยไม่มีWHEREประโยค ดังนั้นอย่าใช้ MyISAM โดยไม่เป็นกังวลต่อ edgecase เฉพาะนี้ InnoDB ที่มีพูลบัฟเฟอร์ขนาดที่เหมาะสมจะเร็วขึ้นสำหรับการสืบค้นจริงทั้งหมด
BMDan

6

เพียงแค่พยายามทำสิ่งต่าง ๆ เพื่อให้เว็บไซต์เร็วขึ้นก็เหมือนกับการเปลี่ยนรถยนต์อย่างกะทันหันและหวังว่าคุณจะได้เร็วขึ้นในครั้งต่อไป

ก่อนอื่นลองผลไม้ที่แขวนต่ำถ้าไม่ช่วยลองหาคอขวดจริง

  1. คุณเปิดกลไกที่มีอยู่แล้ว: การแคชหน้าเว็บ (เฉพาะผู้ใช้ที่ไม่ระบุชื่อ), CSS และ JS agregation
  2. หากโฮสต์ของคุณมีแคช opcode เช่น APC ให้เปิด
  3. ตั้งค่าสถานที่ตั้ง Drupal ของคุณรวมถึงฐานข้อมูลแบบเต็ม
  4. ตรวจสอบให้แน่ใจว่าคุณมี XDebug ทำงานอยู่
  5. เริ่มทำโปรไฟล์ประสิทธิภาพจริง วิธีนี้คุณสามารถระบุได้ว่าส่วนใดของเว็บไซต์ของคุณใช้เวลามาก ยิ่งเว็บไซต์ของคุณช้าลงคุณจะพบโค้ด / องค์ประกอบที่มีความผิดได้ง่ายขึ้น

บ่อยครั้งที่มันเป็นเพียงการสืบค้น DB ช้าซึ่งต้องการดัชนีหรือโมดูลทำสิ่งต่าง ๆ ในทางที่ช้า

ฉันยังค้นพบความแตกต่างที่สำคัญระหว่างโรงเรือนด้วย หากคุณติดตั้ง drupal ใหม่ออกจากกล่องประสิทธิภาพจะดีหรือไม่? ถ้าไม่ใช่ก็ถึงเวลามองหาไก่ตัวอื่น


5

FWIW โหนดเกือบ 20K ของเรา Drupal 6.x ประสบปัญหาด้านประสิทธิภาพบางอย่างและฉันเลือกที่จะย้ายตารางทั้งหมดไปยัง InnoDB มันง่ายและวิธีที่ฉันจัดการก็คือใช้ mysqldump เพื่อถ่ายโอนเนื้อหาทั้งหมดไปยังไฟล์ sql ใช้โปรแกรมแก้ไข (sed) เพื่อแทนที่ MyISAM ไปเป็น InnoDB จากนั้นโหลดฐานข้อมูลจากไฟล์นั้น ข้อเสียอย่างหนึ่งคือคุณไม่สามารถกู้คืนพื้นที่จากฐานข้อมูล InnoDB (IIRC) ได้ แต่ตราบใดที่คุณเก็บตารางที่ซ้ำกันของคุณในฐานข้อมูลแยกต่างหากคุณก็จะไม่มีปัญหา โอ้และเราเห็นการเพิ่มขึ้นอย่างมีนัยสำคัญ และเนื่องจากเรามี Drupal อินสแตนซ์สี่ตัวจำนวนไฟล์ตารางที่แท้จริงจึงถูกลบออกจากระบบไฟล์ (ใช่พวกมันอยู่ภายในไฟล์ InnoDB เอง) นี่คือมูลค่า $ .02 ของฉัน


2
การมีพื้นที่ตาราง InnoDB เพียงอันเดียวอาจช่วยให้คุณประหยัด inodes ได้ แต่ (ตามที่คุณพูดถึงตัวคุณเอง) ด้วยค่าใช้จ่ายของพื้นที่ดิสก์ แม้ว่าคุณจะลบข้อมูลจำนวนมากคุณจะไม่สามารถเรียกคืนพื้นที่ดิสก์นั้นได้ นอกจากนี้ยังส่งผลให้มีไฟล์สำรองขนาดใหญ่ที่ไม่จำเป็นและไม่สามารถกู้คืนตารางเดียวได้ นั่นเป็นเหตุผลที่ฉันชอบใช้innodb_file_per_tableตัวเลือก
geewiz

1
for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; doneนอกจากนี้คุณยังสามารถแปลงตารางในสถานที่: เพิ่มตัวเลือกที่เหมาะสม ( -uroot -psomepassเช่น) เข้ากับสองรายการmysqlหากจำเป็น
BMDan

5

แค่หัวขึ้น ถ้าคุณใช้ Drupal 6 คุณสามารถติดตั้งโมดูลDBTuner ได้ มันสามารถย้ายตารางของคุณจาก MyISAM ไปยัง InnoDB ได้อย่างง่ายดาย ใช่แล้วมีโมดูลสำหรับสิ่งนั้น!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.