ฉันมีเว็บไซต์ Drupal และฉันประสบปัญหาเรื่องประสิทธิภาพ ฉันพบฉันจะแปลงฐานข้อมูลจาก MyISAM เป็น InnoDB ได้อย่างไร ระบุว่าประสิทธิภาพอาจเพิ่มขึ้นโดยการสลับ
ฉันจะรู้ได้อย่างไรว่าฐานข้อมูล MySQL ของฉันคือ InnoDB หรือ MyISAM
ฉันมีเว็บไซต์ Drupal และฉันประสบปัญหาเรื่องประสิทธิภาพ ฉันพบฉันจะแปลงฐานข้อมูลจาก MyISAM เป็น InnoDB ได้อย่างไร ระบุว่าประสิทธิภาพอาจเพิ่มขึ้นโดยการสลับ
ฉันจะรู้ได้อย่างไรว่าฐานข้อมูล MySQL ของฉันคือ InnoDB หรือ MyISAM
คำตอบ:
คุณสามารถเรียกใช้แบบสอบถามที่กำหนดเอง:
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/
SHOW TABLE STATUS
ที่บรรทัดคำสั่งการใช้งาน SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE
ที่จะได้รับการนับที่เรียบง่ายของวิธีการหลายตารางอยู่ในประเภทเครื่องยนต์แต่ละมัน
ประสบการณ์ที่ดีที่สุดของฉันคือการตัดสินใจต่อตาราง InnoDB เป็นสิ่งที่ดีเพราะสามารถหลีกเลี่ยงการล็อกตาราง (ไม่มีกระบวนการอื่นใดสามารถอ่านจากตารางในขณะที่กระบวนการหนึ่งเขียน) แต่มันทำงานได้อย่างยอดเยี่ยมด้วย COUNT () ซึ่งใช้บ่อยสำหรับการสอบถามเพจเจอร์
(แก้ไข: โปรดดูความคิดเห็นของ Clives ด้านล่าง)
นอกจากนี้ยังมีผลกระทบต่อการตั้งค่า MySQL ของคุณขึ้นอยู่กับฐานข้อมูลที่คุณใช้ หากคุณเข้าถึงเซิร์ฟเวอร์ mysqltuner ควรเป็นขั้นตอนแรกของคุณเพื่อตรวจสอบการกำหนดค่า:
COUNT
คำสั่งตามบทความนี้โดยอดีตผู้จัดการกลุ่มที่มีประสิทธิภาพสูงสำหรับ MySQLแม้ว่ามันเท่านั้นจริงๆมีผลกระทบต่อการสืบค้นข้อมูลที่มีCOUNT(*)
โดยไม่ต้องWHERE
ข้อ
SELECT COUNT(*) FROM table
สามารถกลับทันทีด้วยค่าที่ InnoDB ไม่ดังนั้นจึงต้องสแกนดัชนีคีย์หลักทั้งหมด ที่กล่าวว่าในขณะที่ Drupal ทำหลายอย่างSELECT COUNT(*)
ฉันก็นึกได้แค่ที่เดียวในรหัสทั้งหมดที่ทำได้โดยไม่มีWHERE
ประโยค ดังนั้นอย่าใช้ MyISAM โดยไม่เป็นกังวลต่อ edgecase เฉพาะนี้ InnoDB ที่มีพูลบัฟเฟอร์ขนาดที่เหมาะสมจะเร็วขึ้นสำหรับการสืบค้นจริงทั้งหมด
เพียงแค่พยายามทำสิ่งต่าง ๆ เพื่อให้เว็บไซต์เร็วขึ้นก็เหมือนกับการเปลี่ยนรถยนต์อย่างกะทันหันและหวังว่าคุณจะได้เร็วขึ้นในครั้งต่อไป
ก่อนอื่นลองผลไม้ที่แขวนต่ำถ้าไม่ช่วยลองหาคอขวดจริง
บ่อยครั้งที่มันเป็นเพียงการสืบค้น DB ช้าซึ่งต้องการดัชนีหรือโมดูลทำสิ่งต่าง ๆ ในทางที่ช้า
ฉันยังค้นพบความแตกต่างที่สำคัญระหว่างโรงเรือนด้วย หากคุณติดตั้ง drupal ใหม่ออกจากกล่องประสิทธิภาพจะดีหรือไม่? ถ้าไม่ใช่ก็ถึงเวลามองหาไก่ตัวอื่น
FWIW โหนดเกือบ 20K ของเรา Drupal 6.x ประสบปัญหาด้านประสิทธิภาพบางอย่างและฉันเลือกที่จะย้ายตารางทั้งหมดไปยัง InnoDB มันง่ายและวิธีที่ฉันจัดการก็คือใช้ mysqldump เพื่อถ่ายโอนเนื้อหาทั้งหมดไปยังไฟล์ sql ใช้โปรแกรมแก้ไข (sed) เพื่อแทนที่ MyISAM ไปเป็น InnoDB จากนั้นโหลดฐานข้อมูลจากไฟล์นั้น ข้อเสียอย่างหนึ่งคือคุณไม่สามารถกู้คืนพื้นที่จากฐานข้อมูล InnoDB (IIRC) ได้ แต่ตราบใดที่คุณเก็บตารางที่ซ้ำกันของคุณในฐานข้อมูลแยกต่างหากคุณก็จะไม่มีปัญหา โอ้และเราเห็นการเพิ่มขึ้นอย่างมีนัยสำคัญ และเนื่องจากเรามี Drupal อินสแตนซ์สี่ตัวจำนวนไฟล์ตารางที่แท้จริงจึงถูกลบออกจากระบบไฟล์ (ใช่พวกมันอยู่ภายในไฟล์ InnoDB เอง) นี่คือมูลค่า $ .02 ของฉัน
innodb_file_per_table
ตัวเลือก
for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done
นอกจากนี้คุณยังสามารถแปลงตารางในสถานที่: เพิ่มตัวเลือกที่เหมาะสม ( -uroot -psomepass
เช่น) เข้ากับสองรายการmysql
หากจำเป็น
แค่หัวขึ้น ถ้าคุณใช้ Drupal 6 คุณสามารถติดตั้งโมดูลDBTuner ได้ มันสามารถย้ายตารางของคุณจาก MyISAM ไปยัง InnoDB ได้อย่างง่ายดาย ใช่แล้วมีโมดูลสำหรับสิ่งนั้น!