ฉันเห็นด้วยกับ @RemusRusanu (+1 สำหรับคำตอบของเขา)
SELECT COUNT(*) FROM mydb.mytable
ใน InnoDB ควรทำตัวเหมือนเครื่องมือเก็บข้อมูลของทรานแซคชัน เปรียบเทียบกับ MyISAM
MyISAM
ถ้าmydb.mytable
เป็นตาราง MyISAM ที่เปิดตัวเป็นเช่นเดียวกับการทำงานSELECT COUNT(*) FROM mydb.mytable;
SELECT table_rows FROM information_schema.table WHERE table_schema = 'mydb' AND table_name = 'mytable';
สิ่งนี้ทริกเกอร์การค้นหาอย่างรวดเร็วของการนับแถวในส่วนหัวของตาราง MyISAM
InnoDB
หากmydb.mytable
เป็นตาราง InnoDB คุณจะได้รับสิ่งที่เกิดขึ้น คุณมี MVCC ดำเนินการควบคุมสิ่งต่อไปนี้:
- ib_logfile0 / ib_logfile1 (ทำซ้ำบันทึก)
- ibdata1
- เลิกทำการบันทึก
- rollbacks
- การเปลี่ยนแปลงพจนานุกรมข้อมูล
- การจัดการบัฟเฟอร์ของบัฟเฟอร์
- การแยกธุรกรรม (4 ประเภท)
- อ่านซ้ำ
- อ่านความมุ่งมั่น
- อ่านปราศจากข้อผูกมัด
- serializable
การขอ InnoDB สำหรับการนับตารางต้องมีการนำทางผ่านสิ่งที่เป็นลางร้ายเหล่านี้ ในความเป็นจริงไม่มีใครรู้จริง ๆ ว่าการSELECT COUNT(*) from mydb.mytable
นับอ่านซ้ำเท่านั้นหรือรวมถึงการอ่านที่ได้กระทำและผู้ที่ปราศจากข้อผูกมัด
คุณอาจจะพยายามที่จะรักษาเสถียรภาพของสิ่งเล็ก ๆ น้อย ๆ ด้วยการทำให้innodb_stats_on_metadata
ตามเอกสาร MySQL ในinnodb_stats_on_meta_data
เมื่อเปิดใช้งานตัวแปรนี้ (ซึ่งเป็นค่าเริ่มต้นเหมือนก่อนที่จะสร้างตัวแปร) InnoDB จะอัพเดตสถิติในระหว่างคำสั่งข้อมูลเมตาเช่น SHOW TABLE STATUS หรือ SHOW INDEX หรือเมื่อเข้าถึงตาราง Information_SCHEMA ตารางหรือสถิติ (การปรับปรุงเหล่านี้คล้ายกับสิ่งที่เกิดขึ้นสำหรับ ANALYZE TABLE.) เมื่อปิดการใช้งาน InnoDB จะไม่อัปเดตสถิติระหว่างการดำเนินการเหล่านี้ การปิดใช้งานตัวแปรนี้สามารถปรับปรุงความเร็วในการเข้าถึงสำหรับสคีมาที่มีตารางหรือดัชนีจำนวนมาก นอกจากนี้ยังสามารถปรับปรุงเสถียรภาพของแผนการดำเนินการสำหรับแบบสอบถามที่เกี่ยวข้องกับตาราง InnoDB
การปิดใช้งานอาจหรือไม่อาจให้การนับที่มีเสถียรภาพมากขึ้นในแง่ของการตั้งค่าแผนอธิบาย มันอาจส่งผลกระทบต่อประสิทธิภาพSELECT COUNT(*) from mydb.mytable
ในทางที่ดีไม่ดีหรือไม่ดีเลย ลองดูสิ !!!