ความแตกต่างระหว่างตารางการเพิ่มประสิทธิภาพและวิเคราะห์ตารางใน MySQL คืออะไร? ฉันอ่านเอกสารออนไลน์แล้ว แต่ไม่แน่ใจว่าต่างกันอย่างไร
ความแตกต่างระหว่างตารางการเพิ่มประสิทธิภาพและวิเคราะห์ตารางใน MySQL คืออะไร? ฉันอ่านเอกสารออนไลน์แล้ว แต่ไม่แน่ใจว่าต่างกันอย่างไร
คำตอบ:
หากต้องการขยายคำตอบของ @ MitchWheat (+1 สำหรับการตอบโดยตรงก่อน):
วิเคราะห์ตารางวิเคราะห์จัดจำหน่ายที่สำคัญและเก็บไว้ในINFORMATION_SCHEMA.STATISTICS
ตารางที่เหมาะสมจะทำการวิเคราะห์ตารางหลังจากทำการบีบอัดตาราง เทียบเท่าOPTIMIZE TABLE mydb.mytable;
ถ้าตารางคือ MyISAM คือ:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
สำหรับตาราง MyISAM mydb.mytable ใน datadir /var/lib/mysql
คุณมีไฟล์ต่อไปนี้:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(ข้อมูล)/var/lib/mysql/mydb/mytable.MYI
(ดัชนี)OPTIMIZE TABLE mydb.mytable
จะย่อขนาด.MYD
และ.MYI
ไฟล์สำหรับตาราง
นี่ไม่ใช่สิ่งเดียวกันสำหรับ InnoDB นี่คือความแตกต่าง:
ข้อมูลและดัชนีของแต่ละตารางจะถูกเก็บไว้ในไฟล์ tablespace ภายนอก เพราะdatadir
เป็น/var/lib/mysql
และตารางmydb.mytable
มันจะถูกเก็บไว้ดังนี้:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
เมื่อOPTIMIZE TABLE mydb.mytable
ถูกประหารชีวิตmytable.ibd
จะหดตัว
เพียง แต่/var/lib/mysql/mydb/mytable.frm
จะมีอยู่ ทุกข้อมูลและดัชนีหน้าเว็บสำหรับตารางจะถูกเก็บไว้ในไฟล์ระบบmydb.mytable
tablespace/var/lib/mysql/ibdata1
เมื่อOPTIMIZE TABLE mydb.mytable
เรียกใช้งานหน้าข้อมูลและหน้าดัชนีจะถูกเขียนอย่างต่อเนื่องใน ibdata1 น่าเสียดายที่สิ่งนี้ทำให้ ibdata1 เติบโตขึ้นอย่างก้าวกระโดด
ดูภาพตัวแทนจาก Percona CTO Vadim Tkachenko
คุณแสดงความคิดเห็นคือ
ฉันคิดว่าตารางเพิ่มประสิทธิภาพสำหรับ innodb ไม่ได้รับการสนับสนุน ฉันได้รับข้อความดัชนีจะถูกสร้างขึ้นใหม่ มันทำงานยังไง?
ฉันลองสิ่งนี้แล้ว
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
คุณถูก. คุณไม่สามารถเรียกใช้OPTIMIZE TABLE
เป็นการดำเนินการเดียว สิ่งที่ InnoDB ทำแทนมีดังต่อไปนี้:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
คุณสามารถทำตามขั้นตอนเหล่านี้ได้ด้วยตัวเอง
อย่างไรก็ตามในความซื่อสัตย์ทั้งหมดคุณไม่ควรต้องทำงานANALYZE TABLE
กับตาราง InnoDB เพราะทุกครั้งที่มีการดำเนินการสืบค้น InnoDB Storage Engine จะทำการประมาณค่าความสำคัญของตารางตามการส่งผ่านหน้าต่างๆในดัชนี หากมีจำนวนมากINSERTs
, UPDATEs
และจากนั้นคุณจะต้องDELETEs
ANALYZE TABLE
เมื่อมีจำนวนมากDELETEs
นั้นALTER TABLE mydb.mytable ENGINE=InnoDB;
เป็นสิ่งจำเป็นที่จะหดตัวลงในตาราง
ฉันเขียนบทความเกี่ยวกับความไร้ประโยชน์ของANALYZE TABLE
ใน InnoDB ในบางกรณี:
Oct 16, 2011
: ทันใดนั้นก็ต้องสร้างดัชนีใหม่เพื่อป้องกันไม่ให้เว็บไซต์ลงไปJun 21, 2011
: MySQL Query Optimizer อ่านสถิติของดัชนีจากที่ใด?OPTIMIZE TABLE
ได้" เมื่อคุณOPTIMIZE TABLE
ใช้งานตาราง InnoDB นั้น MySQL กำลังดำเนินการALTER TABLE ... ENGINE=InnoDB
และANALYZE TABLE ...
ดำเนินการกับคุณเมื่อมีข้อความว่า "กำลังสร้าง + วิเคราะห์ตารางแทน"
OPTIMIZE TABLE dat;
ใน MySQL 5.5.29 Table does not support optimize, doing recreate + analyze instead
และมันบ่นทันที ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
นั่นเป็นเหตุผลที่ผมขอแนะนำให้
OPTIMIZE TABLE
ใช้งาน InnoDB เซิร์ฟเวอร์จะใช้งานจริงALTER TABLE ... ENGINE=InnoDB
และดำเนินANALYZE TABLE
การเบื้องหลังก่อนที่จะตอบกลับ ... ดังนั้นคุณจึงสามารถใช้งานOPTIMIZE TABLE
InnoDB ได้และบรรลุผลตามที่ตั้งใจไว้
ขึ้นอยู่กับเวอร์ชันของ MySQL และเอนจินการเก็บข้อมูล แต่โดยทั่วไป:
ปรับตารางให้เหมาะสมตาราง วิเคราะห์จัดเก็บการกระจายคีย์สำหรับตารางเรียกคืนพื้นที่ที่ไม่ได้ใช้และจัดเรียงไฟล์ข้อมูลใหม่
วิเคราะห์ตาราง วิเคราะห์ตารางและจัดเก็บการกระจายคีย์เท่านั้น