“ ตารางไม่รองรับการเพิ่มประสิทธิภาพการสร้าง + วิเคราะห์ใหม่แทน” หมายความว่าอย่างไร


100

ฉันกำลังทำงานกับ MySQL 5.5 และพยายามสร้างดัชนีใหม่โดยใช้OPTIMIZE TABLEแบบสอบถาม ฉันได้รับข้อผิดพลาดด้านล่าง:

ตารางไม่รองรับการปรับให้เหมาะสมสร้างใหม่ + วิเคราะห์แทน

สิ่งนี้หมายความว่า? MySQL engine ไม่อนุญาตให้ Index Rebuild หรือไม่? กำลังทำอะไรอยู่เบื้องหลังข้อความนี้ที่ระดับ MySQL 5.5 Engine

คำตอบ:


193

นั่นเป็นข้อความที่ให้ข้อมูลจริงๆ

เป็นไปได้ว่าคุณกำลังทำ OPTIMIZE บนตารางInnoDB (ตารางที่ใช้เครื่องมือจัดเก็บข้อมูล InnoDB แทนที่จะเป็นระบบจัดเก็บข้อมูลMyISAM )

InnoDB ไม่รองรับ OPTIMIZE แบบที่ MyISAM ทำ มันทำสิ่งที่แตกต่าง สร้างตารางว่างและคัดลอกแถวทั้งหมดจากตารางที่มีอยู่ลงในตารางและโดยพื้นฐานแล้วจะลบตารางเก่าและเปลี่ยนชื่อตารางใหม่จากนั้นจึงเรียกใช้ ANALYZE เพื่อรวบรวมสถิติ นั่นคือสิ่งที่ใกล้เคียงที่สุดที่ InnoDB สามารถทำได้ OPTIMIZE

ข้อความที่คุณได้รับนั้นโดยพื้นฐานแล้วเซิร์ฟเวอร์ MySQL จะทำซ้ำสิ่งที่เอ็นจิ้นการจัดเก็บ InnoDB บอกกับเซิร์ฟเวอร์ MySQL:

Table ไม่รองรับการปรับให้เหมาะสมคือกลไกการจัดเก็บ InnoDB บอกว่า ...

"ฉัน (เครื่องมือจัดเก็บข้อมูล InnoDB) ไม่ได้ดำเนินการ OPTIMIZE เหมือนเพื่อนของฉัน (เครื่องมือจัดเก็บข้อมูล MyISAM) ทำ"

"ทำการสร้างใหม่ + วิเคราะห์แทน"คือเครื่องมือจัดเก็บข้อมูล InnoDB บอกว่า ...

"ผมได้ตัดสินใจที่จะดำเนินการที่แตกต่างกันชุดของการดำเนินงานซึ่งจะบรรลุผลเทียบเท่า."


14
โอเคคุณช่วยแบ่งปันวิธีการต่างๆที่คุณกำลังทำอยู่ได้ไหม
Vikrant More

ฉันแน่ใจว่านี่อยู่ในคู่มืออ้างอิง MySQL ที่ไหนสักแห่ง นี่เป็นพฤติกรรมที่คาดหวังและไม่มีอะไรต้องกังวล (ยกเว้นว่าตารางจะถูก "ล็อก" และไม่สามารถใช้งานได้ในขณะที่กระบวนการทำงานจนเสร็จสมบูรณ์ซึ่งอาจใช้เวลาสักครู่สำหรับตาราง HUGH JASS) อ้างอิง: https://dev.mysql.com/doc/refman/5.5/ en / optimize-table.htmlดูส่วน "รายละเอียด InnoDB"
spencer7593

คุณยังสามารถใช้ MySQL Workbench เพื่อดำเนินการปรับตารางให้เหมาะสม ดูเอกสารSchema และ Table Inspectorสำหรับข้อมูลเพิ่มเติม สังเกตตัวเลือก "เพิ่มประสิทธิภาพตาราง"
Philip Olson

1
คำอธิบายที่ยอดเยี่ยมสำหรับผู้ที่เริ่มต้นในโลกฐานข้อมูล ขอบคุณมาก
tachomi

5
ระวัง - อย่าใช้สิ่งนี้หากคุณมีพื้นที่ดิสก์เหลือน้อยเนื่องจากอาจทำให้เซิร์ฟเวอร์ของคุณหมดในการพยายามสร้างตารางขนาดใหญ่มากขึ้นใหม่
Danny Staple

22

OPTIMIZE TABLEทำงานได้ดีกับเครื่องยนต์ InnoDB ตามบทความสนับสนุนอย่างเป็นทางการ: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

คุณจะสังเกตเห็นว่าการเพิ่มประสิทธิภาพตาราง InnoDB จะสร้างโครงสร้างตารางขึ้นมาใหม่และอัปเดตสถิติดัชนี (บางอย่างเช่นALTER TABLE)

โปรดทราบว่าข้อความนี้อาจเป็นการกล่าวถึงข้อมูลเท่านั้นและข้อมูลที่สำคัญมากคือสถานะของข้อความค้นหาของคุณ: ตกลง!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

2
ไม่จริง MySQL จะให้เหตุผลที่ล้มเหลว: ความล้มเหลวในการเขียนไฟล์ชั่วคราว, การดำเนินการล้มเหลว
iwind

8

ตัวเลือกที่ดีที่สุดคือสร้างตารางใหม่ที่มีคุณสมบัติเดียวกัน

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

เปลี่ยนชื่อ NEW.NAME.TABLE และ TABLE.CRASH

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

หลังจากทำงานได้ดีให้ลบ

DROP TABLE <TABLE.CRASHED.BACKUP>;

2
วิธีนี้เก็บดัชนีและทริกเกอร์ไว้หรือไม่?
Joel Murphy

1
ใช่แน่นอน ทั้งหมด! คุณสามารถลองใช้ phpMyAdmin เพื่อตรวจสอบอีกครั้ง
tquang

2
สิ่งนี้ไม่ได้สร้าง Foreign Key ขึ้นมาใหม่
DanB

1

ตัวเลือกที่ดีกว่าคือสร้างตารางใหม่คัดลอกแถวไปยังตารางปลายทางวางตารางจริงและเปลี่ยนชื่อตารางที่สร้างขึ้นใหม่ วิธีนี้เหมาะสำหรับโต๊ะขนาดเล็ก


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