В чем разница между оптимизацией таблицы и анализа таблицы в MySQL

29

В чем разница между таблицей оптимизации и таблицей анализа в mysql? Я читал онлайн-документы, но не уверен, в чем разница.

логический
источник

Ответы:

28

Чтобы расширить ответ @ 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

Для таблицы 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. Вот как это отличается:

InnoDB ( innodb_file_per_table включен)

Данные и индексы каждой таблицы хранятся во внешнем файле табличного пространства. Для datadirIS /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 Вадима Ткаченко

InnoDB Сантехника

ОБНОВЛЕНИЕ 2013-02-26 22:33 EST

Ваш комментарий был

Я думаю, оптимизировать таблицу для 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 в некоторых случаях:

RolandoMySQLDBA
источник
Я думаю, оптимизировать таблицу для innodb не поддерживается. Я получил сообщение, индекс будет воссоздан. Как это работает?
логическое значение
@RolandoMySQLDBA Я не уверен, что означает, когда вы говорите: «Вы не можете бежать OPTIMIZE TABLE». Когда OPTIMIZE TABLEдля таблицы InnoDB, MySQL исполняет ALTER TABLE ... ENGINE=InnoDBи ANALYZE TABLE ...операции для вас , когда он говорит , что «делать Recreate + анализировать таблицу вместо этого.»
Майкл - sqlbot
@ Michael-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;.
RolandoMySQLDBA
Да, но я бы сказал, что это произошло сразу для вас, потому что таблица, с которой вы тестировали, была очень маленькой. Когда вы работаете OPTIMIZE TABLEс InnoDB, сервер на самом деле выполняется ALTER TABLE ... ENGINE=InnoDBи ANALYZE TABLEнегласно, прежде чем возвращать этот ответ ... так что вы действительно можете работать OPTIMIZE TABLEна InnoDB и достичь желаемого эффекта.
Майкл - sqlbot
15

Зависит от вашей версии MySQL и механизма хранения, но в целом:

OPTIMIZE TABLE Анализирует таблицу, сохраняет распределение ключей для таблицы, восстанавливает неиспользуемое пространство и дефрагментирует файл данных.

ANALYZE TABLE только анализирует таблицу и сохраняет распределение ключей.

Митч Пшеничный
источник