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


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 ...

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


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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

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>;

2
Сохраняет ли этот метод индексы и триггеры?
Джоэл Мерфи

1
Да, конечно. Все они! Вы можете попробовать, а затем снова использовать phpMyAdmin для проверки
tquang

2
Это не воссоздает внешний ключ.
DanB

1

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


3
Я бы предложил собрать пример кода, который будет сопровождать ваш ответ. Посмотрите, как мне написать хороший ответ
Фриц
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.