В чем разница между таблицей оптимизации и таблицей анализа в 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. Вот как это отличается:
Данные и индексы каждой таблицы хранятся во внешнем файле табличного пространства. Для datadir
IS /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 только анализирует таблицу и сохраняет распределение ключей.
источник