Что означает "Таблица не поддерживает оптимизацию, что означает" воссоздать + анализ "?
Я работаю над MySQL 5.5 и пытаюсь выполнить перестройку индекса с помощью запроса OPTIMIZE TABLE
. Я получаю сообщение об ошибке ниже:
Таблица не поддерживает оптимизацию, вместо этого заново создайте + анализ
Что это значит? Является ли движок MySQL не позволяющим перестраивать индексы? Что делается за этим сообщением на уровне MySQL 5.5 Engine?
Ответы
Ответ 1
Это действительно информационное сообщение.
Вероятно, вы делаете OPTIMIZE на таблице InnoDB (таблица с использованием механизма хранения InnoDB, а не MyISAM.
InnoDB не поддерживает OPTIMIZE, как это делает MyISAM. Он делает что-то другое. Он создает пустую таблицу и копирует все строки из существующей таблицы в нее и по существу удаляет старую таблицу и переименовывает новую таблицу, а затем запускает ANALYZE для сбора статистики. Это самое близкое, что InnoDB может сделать для OPTIMIZE.
Сообщение, которое вы получаете, это в основном сервер MySQL, повторяющий то, что сказал сервер хранения InnoDB на сервере MySQL:
Таблица не поддерживает оптимизацию - это механизм хранения InnoDB, говорящий...
"Я (механизм хранения InnoDB) не выполняю операцию OPTIMIZE, как мой друг (механизм хранения MyISAM).
"делать воссоздание + анализировать" - это механизм хранения InnoDB, говорящий...
"Я решил выполнить другой набор операций, которые достигнут эквивалентного результата".
Ответ 2
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 |
+----------+----------+----------+-------------------------------------------------------------------+
Ответ 3
Лучший вариант - создать новую таблицу с теми же свойствами
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>;
Ответ 4
Лучшим вариантом является создание новой таблицы, копирующей строки в таблицу назначения, удаление фактической таблицы и переименование вновь созданной таблицы.
Этот метод хорош для небольших таблиц,