Подтвердить что ты не робот

Что означает "Таблица не поддерживает оптимизацию, что означает" воссоздать + анализ "?

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

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

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

4b9b3361

Ответ 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

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