В чем разница между таблицей оптимизации и таблицей анализа в mysql? Я читал онлайн-документы, но не уверен, в чем разница.
В чем разница между таблицей оптимизации и таблицей анализа в mysql? Я читал онлайн-документы, но не уверен, в чем разница.
Ответы:
Чтобы расширить ответ @ MitchWheat (+1 для прямого ответа первым):
ANALYZE TABLE проверяет распределение ключей и сохраняет их в INFORMATION_SCHEMA.STATISTICS .
OPTIMIZE TABLE выполняет ANALYZE TABLE после некоторого сжатия таблицы. Эквивалент,OPTIMIZE TABLE mydb.mytable;если таблица была MyISAM это:
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Для таблицы 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. Вот как это отличается:
Данные и индексы каждой таблицы хранятся во внешнем файле табличного пространства. Для datadirIS /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 Вадима Ткаченко
Ваш комментарий был
Я думаю, оптимизировать таблицу для 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 в некоторых случаях:
Oct 16, 2011: Вдруг придется перестраивать индексы, чтобы сайт не рухнулJun 21, 2011: Откуда MySQL Query Optimizer читает статистику индекса?OPTIMIZE TABLE». Когда OPTIMIZE TABLEдля таблицы InnoDB, MySQL исполняет ALTER TABLE ... ENGINE=InnoDBи ANALYZE TABLE ...операции для вас , когда он говорит , что «делать Recreate + анализировать таблицу вместо этого.»
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 и механизма хранения, но в целом:
OPTIMIZE TABLE Анализирует таблицу, сохраняет распределение ключей для таблицы, восстанавливает неиспользуемое пространство и дефрагментирует файл данных.
ANALYZE TABLE только анализирует таблицу и сохраняет распределение ключей.