"तालिका ऑप्टिमाइज़ेशन का समर्थन नहीं करती है, इसके बजाय फिर से बनाना + विश्लेषण करना" मतलब है?


97

मैं MySQL 5.5 पर काम कर रहा हूं और एक OPTIMIZE TABLEक्वेरी का उपयोग करके सूचकांक पुनर्निर्माण का प्रयास कर रहा हूं । मुझे नीचे त्रुटि मिल रही है:

तालिका ऑप्टिमाइज़ करने का समर्थन नहीं करती है, इसके बजाय पुनः बनाना + विश्लेषण करती है

इसका क्या मतलब है? क्या MySQL इंजन अनुक्रमणिका पुनर्निर्माण की अनुमति नहीं दे रहा है? इस संदेश के पीछे MySQL 5.5 इंजन स्तर पर क्या किया जा रहा है?

जवाबों:


190

यह वास्तव में एक सूचनात्मक संदेश है।

इसी तरह, आप एक पर अनुकूलन कर रहे हैं InnoDB तालिका (तालिका InnoDB स्तोरागे engine, बजाय का उपयोग कर MyISAM भंडारण इंजन)।

InnoDB माईसम को जिस तरह से ऑप्टिमाइज करता है उसका समर्थन नहीं करता है। यह कुछ अलग करता है। यह एक खाली तालिका बनाता है, और मौजूदा तालिका से सभी पंक्तियों को इसमें कॉपी करता है, और अनिवार्य रूप से पुरानी तालिका को हटा देता है और नई तालिका का नाम बदल देता है, और फिर आंकड़े इकट्ठा करने के लिए एक ANALYZE चलाता है। वह सबसे नज़दीकी है कि InnoDB एक OPTIMIZE करने के लिए मिल सकता है।

जो संदेश आपको मिल रहा है, वह मूल रूप से MySQL सर्वर है, जो दोहराता है कि InnoDB स्टोरेज इंजन ने MySQL सर्वर को बताया था:

तालिका समर्थन का अनुकूलन नहीं करती है InnoDB संग्रहण इंजन कह रहा है ...

"मैं (InnoDB स्टोरेज इंजन) अपने दोस्त (MyISAM स्टोरेज इंजन) की तरह एक OPTIMIZE ऑपरेशन नहीं करता।"

"फिर से करना + विश्लेषण करना" इनोबीडी स्टोरेज इंजन कह रहा है ...

"मैंने ऑपरेशन का एक अलग सेट करने का फैसला किया है जो एक समान परिणाम प्राप्त करेगा।"


13
ठीक है, क्या आप कृपया उस अलग तरीके को साझा कर सकते हैं जो आप कर रहे हैं।
विक्रांत मोर

मुझे यकीन है कि यह कहीं MySQL संदर्भ मैनुअल में है; यह अपेक्षित व्यवहार है, और इसके बारे में चिंतित होने के लिए कुछ भी नहीं है। (सिवाय इसके कि तालिका "लॉक" होगी और प्रक्रिया पूरी होने के दौरान अनुपलब्ध रहेगी, जो कि HUGH JASS तालिका के लिए कुछ समय ले सकती है।) संदर्भ: https://dev.mysql.com/doc/refman/5.5/ en / ऑप्टिमाइज़-टेबल.html "InnoDB विवरण" अनुभाग देखें।
spencer7593

तालिका अनुकूलन करने के लिए आप MySQL कार्यक्षेत्र का उपयोग भी कर सकते हैं। देखें स्कीमा और टेबल इंस्पेक्टर प्रलेखन अतिरिक्त जानकारी के लिए। "ऑप्टिमाइज़ टेबल" विकल्प पर ध्यान दें।
फिलिप ओल्सन

1
उन लोगों के लिए उत्कृष्ट स्पष्टीकरण जो डीबी दुनिया में पहल कर रहे हैं। बहुत बहुत धन्यवाद
22

5
खबरदार - यदि आप डिस्क स्थान पर कम हैं, तो इसका उपयोग न करें क्योंकि इससे आपके सर्वर को बहुत बड़ी तालिका को फिर से बनाने की कोशिश करने की संभावना है।
डैनी स्टेपल

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 विफलता का कारण देगा: अस्थायी फ़ाइल विफलता लिखना, ऑपरेशन विफल।
19

9

सर्वश्रेष्ठ विकल्प समान गुणों के साथ नई तालिका बना रहा है

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>;

1
क्या यह विधि अनुक्रमित और ट्रिगर रखती है?
जोएल मर्फी

1
हां बिल्कुल। उन सभी को! आप इसे उसके बाद फिर से जाँच के लिए phpMyAdmin का उपयोग कोशिश कर सकते हैं
tquang

यह फॉरेन की को दोबारा नहीं बनाता है।
DanB

1

बेहतर विकल्प यह है कि एक नई तालिका बनाएं पंक्तियों को गंतव्य तालिका में कॉपी करें, वास्तविक तालिका को ड्रॉप करें और नव निर्मित तालिका का नाम बदलें। यह विधि छोटे तालिकाओं के लिए अच्छी है,


3
मैं आपके उत्तर के साथ जाने के लिए एक साथ उदाहरण कोड डालने का सुझाव दूंगा। एक नज़र
डालिए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.