Mysql में ऑप्टिमाइज़ टेबल और एनालिसिस टेबल में क्या अंतर है


29

Mysql में ऑप्टिमाइज़ टेबल और एनालिसिस टेबल के बीच अंतर क्या है? मैंने ऑनलाइन डॉक्स पढ़े हैं, लेकिन निश्चित नहीं है कि अंतर क्या है।

जवाबों:


28

@ MitchWheat के उत्तर पर विस्तार करने के लिए (सीधे पहले जवाब देने के लिए +1):

ANALYZE टेबल कुंजी वितरण की जांच करता है और उन्हें INFORMATION_SCHEMA.STATISTICS में संग्रहीत करता है।

अनुकूलन टेबल प्रदर्शन तालिका विश्लेषण कुछ तालिका संपीड़न करने के बाद। OPTIMIZE TABLE mydb.mytable;यदि तालिका MyISAM थी,तोइसके बराबरहै:

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

MyISAM

डेटासिर में 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 के लिए समान नहीं है। यहाँ है कि यह कैसे अलग है:

InnoDB ( innodb_file_per_table सक्षम)

प्रत्येक तालिका का डेटा और इंडेक्स एक बाहरी टेबलस्पेस फ़ाइल में संग्रहीत होते हैं। के लिए 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सिस्टम टेबलस्पेस फ़ाइल में संग्रहीत हैं /var/lib/mysql/ibdata1

जब OPTIMIZE TABLE mydb.mytableनिष्पादित किया जाता है, तो डेटा और इंडेक्स पेजों को ibdata1 में सन्निहित रूप से लिखा जाता है। दुर्भाग्य से, यह ibdata1 छलांग और सीमा में बढ़ता है।

Percona CTO वादिम Tkachenko से सचित्र प्रतिनिधित्व देखें

InnoDB नलसाजी

अद्यतन 2013-02-26 22:33 ईएसटी

आप टिप्पणी कर रहे थे

मुझे लगता है, निर्दोष के लिए ऑप्टिमाइज़ टेबल समर्थित नहीं है। मुझे एक संदेश मिला, सूचकांक फिर से बनाया जाएगा। यह कैसे काम करता है?

मैंने यह कोशिश की

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 पर व्यर्थता के बारे में पोस्ट लिखा था :


मुझे लगता है, निर्दोष के लिए ऑप्टिमाइज़ टेबल समर्थित नहीं है। मुझे एक संदेश मिला, सूचकांक फिर से बनाया जाएगा। यह कैसे काम करता है?
बूलियन

@RolandoMySQLDBA मुझे यकीन नहीं है कि जब आप कहते हैं तो इसका क्या मतलब है, "आप भाग नहीं सकते OPTIMIZE TABLE।" जब आप OPTIMIZE TABLEएक InnoDB तालिका के लिए होते हैं, तो MySQL आपके लिए संचालन ALTER TABLE ... ENGINE=InnoDBऔर ANALYZE TABLE ...संचालन कर रहा है जब यह कहता है कि "इसके बजाय तालिका को फिर से बनाना + विश्लेषण करना है।"
माइकल - sqlbot

@ माइकल- sqlbot जैसा कि मेरे उत्तर में दिखाया गया है, मैं 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 TABLEInnoDB पर होते हैं, तो सर्वर वास्तव में उस प्रतिक्रिया को वापस करने से पहले वास्तव में निष्पादित ALTER TABLE ... ENGINE=InnoDBऔर ANALYZE TABLEपर्दे के पीछे करता है ... ताकि आप वास्तव OPTIMIZE TABLEमें InnoDB पर चल सकें , और इच्छित प्रभाव को प्राप्त कर सकें।
माइकल - sqlbot

15

MySQL और स्टोरेज इंजन के आपके संस्करण पर निर्भर करता है लेकिन सामान्य रूप से:

वैकल्पिक तालिका विश्लेषण तालिका, तालिका के लिए कुंजी वितरण को संग्रहीत करता है, अप्रयुक्त स्थान को पुनः प्राप्त करता है और डेटा फ़ाइल को डीफ़्रैग्मेन्ट करता है।

विश्लेषण तालिका केवल तालिका का विश्लेषण करती है और कुंजी वितरण को संग्रहीत करती है।

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