ความแตกต่างระหว่างตารางการเพิ่มประสิทธิภาพและวิเคราะห์ตารางใน MySQL คืออะไร


29

ความแตกต่างระหว่างตารางการเพิ่มประสิทธิภาพและวิเคราะห์ตารางใน MySQL คืออะไร? ฉันอ่านเอกสารออนไลน์แล้ว แต่ไม่แน่ใจว่าต่างกันอย่างไร

คำตอบ:


28

หากต้องการขยายคำตอบของ @ MitchWheat (+1 สำหรับการตอบโดยตรงก่อน):

วิเคราะห์ตารางวิเคราะห์จัดจำหน่ายที่สำคัญและเก็บไว้ในINFORMATION_SCHEMA.STATISTICS

ตารางที่เหมาะสมจะทำการวิเคราะห์ตารางหลังจากทำการบีบอัดตาราง เทียบเท่าOPTIMIZE TABLE mydb.mytable;ถ้าตารางคือ MyISAM คือ:

ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;

MyISAM

สำหรับตาราง 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 นี่คือความแตกต่าง:

InnoDB ( เปิดใช้งานinnodb_file_per_table )

ข้อมูลและดัชนีของแต่ละตารางจะถูกเก็บไว้ในไฟล์ 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จะหดตัว

InnoDB ( innodb_file_per_tableถูกปิดใช้งาน)

เพียง แต่/var/lib/mysql/mydb/mytable.frmจะมีอยู่ ทุกข้อมูลและดัชนีหน้าเว็บสำหรับตารางจะถูกเก็บไว้ในไฟล์ระบบmydb.mytable tablespace/var/lib/mysql/ibdata1

เมื่อOPTIMIZE TABLE mydb.mytableเรียกใช้งานหน้าข้อมูลและหน้าดัชนีจะถูกเขียนอย่างต่อเนื่องใน ibdata1 น่าเสียดายที่สิ่งนี้ทำให้ ibdata1 เติบโตขึ้นอย่างก้าวกระโดด

ดูภาพตัวแทนจาก Percona CTO Vadim Tkachenko

ท่อ InnoDB

ปรับปรุง 2013-02-26 22:33 EST

คุณแสดงความคิดเห็นคือ

ฉันคิดว่าตารางเพิ่มประสิทธิภาพสำหรับ 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 ในบางกรณี:


ฉันคิดว่าตารางเพิ่มประสิทธิภาพสำหรับ innodb ไม่ได้รับการสนับสนุน ฉันได้รับข้อความดัชนีจะถูกสร้างขึ้นใหม่ มันทำงานยังไง?
บูลีน

@RolandoMySQLDBA ฉันไม่แน่ใจว่าหมายความว่าอย่างไรเมื่อคุณพูดว่า "คุณไม่สามารถทำงานOPTIMIZE TABLEได้" เมื่อคุณOPTIMIZE TABLEใช้งานตาราง InnoDB นั้น MySQL กำลังดำเนินการALTER TABLE ... ENGINE=InnoDBและANALYZE TABLE ...ดำเนินการกับคุณเมื่อมีข้อความว่า "กำลังสร้าง + วิเคราะห์ตารางแทน"
Michael - sqlbot

@-sqlbot Michael ตามที่ปรากฏในคำตอบฉันฉันวิ่งOPTIMIZE TABLE dat;ใน MySQL 5.5.29 Table does not support optimize, doing recreate + analyze insteadและมันบ่นทันที ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;นั่นเป็นเหตุผลที่ผมขอแนะนำให้
RolandoMySQLDBA

ใช่ แต่ฉันขอยืนยันว่ามันเกิดขึ้นทันทีสำหรับคุณเพราะตารางที่คุณทดสอบมีขนาดเล็กมาก เมื่อคุณOPTIMIZE TABLEใช้งาน InnoDB เซิร์ฟเวอร์จะใช้งานจริงALTER TABLE ... ENGINE=InnoDBและดำเนินANALYZE TABLEการเบื้องหลังก่อนที่จะตอบกลับ ... ดังนั้นคุณจึงสามารถใช้งานOPTIMIZE TABLEInnoDB ได้และบรรลุผลตามที่ตั้งใจไว้
Michael - sqlbot

15

ขึ้นอยู่กับเวอร์ชันของ MySQL และเอนจินการเก็บข้อมูล แต่โดยทั่วไป:

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

วิเคราะห์ตาราง วิเคราะห์ตารางและจัดเก็บการกระจายคีย์เท่านั้น

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