Что означает «Таблица не поддерживает оптимизацию, вместо этого выполняется воссоздание + анализ»?

100

Я работаю над MySQL 5.5 и пытаюсь выполнить восстановление индекса с помощью OPTIMIZE TABLEзапроса. Я получаю сообщение об ошибке ниже:

Таблица не поддерживает оптимизацию, вместо этого выполняется воссоздание + анализ

Что это значит? Механизм MySQL не позволяет перестроить индекс? Что скрывается за этим сообщением на уровне MySQL 5.5 Engine?

Викрант Море
источник

Ответы:

193

Это действительно информационное сообщение.

Скорее всего, вы выполняете OPTIMIZE для таблицы InnoDB (таблица, использующая механизм хранения InnoDB, а не механизм хранения MyISAM ).

InnoDB не поддерживает OPTIMIZE, как MyISAM. Это что-то другое. Он создает пустую таблицу и копирует в нее все строки из существующей таблицы, по существу удаляет старую таблицу и переименовывает новую таблицу, а затем запускает АНАЛИЗ для сбора статистики. Это самое близкое, что InnoDB может сделать для ОПТИМИЗАЦИИ.

Сообщение, которое вы получаете, в основном повторяет сервер MySQL то, что механизм хранения InnoDB сказал серверу MySQL:

Таблица не поддерживает оптимизацию - это механизм хранения InnoDB, говорящий ...

«Я (механизм хранения InnoDB) не выполняю операцию OPTIMIZE, как мой друг (механизм хранения MyISAM)».

"вместо этого выполняем воссоздание + анализ", - говорит механизм хранения InnoDB ...

«Я решил выполнить другой набор операций, который даст эквивалентный результат».

spencer7593
источник
14
хорошо, не могли бы вы поделиться другим способом, которым вы делаете.
Vikrant More
Я уверен, что это где-то есть в Справочном руководстве MySQL; это ожидаемое поведение, и не о чем беспокоиться. (За исключением того, что таблица будет «заблокирована» и будет недоступна, пока процесс завершится, что может занять некоторое время для таблицы HUGH JASS.) Ссылка: https://dev.mysql.com/doc/refman/5.5/ en / optimize-table.html См. раздел «Сведения о InnoDB».
spencer7593 04
Вы также можете использовать MySQL Workbench для оптимизации таблицы. Смотрите документацию схемы и таблица инспектора для получения дополнительной информации. Обратите внимание на опцию «Оптимизировать таблицу».
Филип Олсон
1
Отличное объяснение для людей, которые инициируют в мире db. Большое спасибо
tachomi
5
Осторожно - не используйте это, если у вас мало места на диске, так как это может привести к тому, что ваш сервер выйдет из строя, пытаясь воссоздать очень большую таблицу.
Дэнни Стейпл
22

OPTIMIZE TABLEотлично работает с движком InnoDB согласно официальной статье поддержки: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Вы заметите, что оптимизация таблиц InnoDB перестроит структуру таблицы и обновит статистику индекса (что-то вроде ALTER TABLE).

Имейте в виду, что это сообщение может быть только информационным упоминанием, и очень важная информация - это статус вашего запроса: просто ОК!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
Sdesvergez
источник
2
Не совсем, MySQL укажет причину сбоя: временный сбой записи файла, сбой операции.
iwind
8

Лучший вариант - создать новую таблицу с такими же свойствами

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Переименуйте NEW.NAME.TABLE и TABLE.CRASH.

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

После работы удаляем

DROP TABLE <TABLE.CRASHED.BACKUP>;
Tquang
источник
2
Сохраняет ли этот метод индексы и триггеры?
Джоэл Мерфи
1
Да, конечно. Все они! Вы можете попробовать, а затем снова использовать phpMyAdmin для проверки
tquang
2
Это не воссоздает внешний ключ.
DanB
1

Лучший вариант - создать новую таблицу, скопировать строки в целевую таблицу, удалить фактическую таблицу и переименовать вновь созданную таблицу. Этот метод хорош для небольших столов,

АШОК МАНГХАТ
источник
3
Я бы предложил собрать пример кода, который будет сопровождать ваш ответ. Посмотрите, как мне написать хороший ответ
Фриц