जवाबों:
@ MitchWheat के उत्तर पर विस्तार करने के लिए (सीधे पहले जवाब देने के लिए +1):
ANALYZE टेबल कुंजी वितरण की जांच करता है और उन्हें INFORMATION_SCHEMA.STATISTICS में संग्रहीत करता है।
अनुकूलन टेबल प्रदर्शन तालिका विश्लेषण कुछ तालिका संपीड़न करने के बाद। OPTIMIZE TABLE mydb.mytable;
यदि तालिका MyISAM थी,तोइसके बराबरहै:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
डेटासिर में MyISAM तालिका mydb.mytable के लिए /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 के लिए समान नहीं है। यहाँ है कि यह कैसे अलग है:
प्रत्येक तालिका का डेटा और इंडेक्स एक बाहरी टेबलस्पेस फ़ाइल में संग्रहीत होते हैं। के लिए 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
सिस्टम टेबलस्पेस फ़ाइल में संग्रहीत हैं /var/lib/mysql/ibdata1
।
जब OPTIMIZE TABLE mydb.mytable
निष्पादित किया जाता है, तो डेटा और इंडेक्स पेजों को ibdata1 में सन्निहित रूप से लिखा जाता है। दुर्भाग्य से, यह ibdata1 छलांग और सीमा में बढ़ता है।
Percona CTO वादिम Tkachenko से सचित्र प्रतिनिधित्व देखें
आप टिप्पणी कर रहे थे
मुझे लगता है, निर्दोष के लिए ऑप्टिमाइज़ टेबल समर्थित नहीं है। मुझे एक संदेश मिला, सूचकांक फिर से बनाया जाएगा। यह कैसे काम करता है?
मैंने यह कोशिश की
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 संग्रहण इंजन इंडेक्स में पृष्ठों के माध्यम से गुजरने के आधार पर टेबल कार्डिनैलिटी पर एक अनुमान लगाता है। अगर वहाँ की बड़ी संख्या में हैं INSERTs
, UPDATEs
और DELETEs
है, तो आप करने की आवश्यकता होगी ANALYZE TABLE
। जब अधिक संख्या होती है DELETEs
, तो ALTER TABLE mydb.mytable ENGINE=InnoDB;
तालिका को सिकोड़ने की आवश्यकता होती है।
मैं वास्तव ANALYZE TABLE
में कुछ उदाहरणों में InnoDB पर व्यर्थता के बारे में पोस्ट लिखा था :
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 और स्टोरेज इंजन के आपके संस्करण पर निर्भर करता है लेकिन सामान्य रूप से:
वैकल्पिक तालिका विश्लेषण तालिका, तालिका के लिए कुंजी वितरण को संग्रहीत करता है, अप्रयुक्त स्थान को पुनः प्राप्त करता है और डेटा फ़ाइल को डीफ़्रैग्मेन्ट करता है।
विश्लेषण तालिका केवल तालिका का विश्लेषण करती है और कुंजी वितरण को संग्रहीत करती है।