Що означає «Таблиця не підтримує оптимізацію, замість цього відтворюючи + аналізуючи»?


97

Я працюю над MySQL 5.5 і намагаюся виконати відновлення індексу за допомогою OPTIMIZE TABLEзапиту. Я отримую помилку нижче:

Таблиця не підтримує оптимізацію, замість цього виконується відтворення + аналіз

Що це означає? Чи не дозволяє движок MySQL переробляти індекс? Що робиться за цим повідомленням на рівні двигуна MySQL 5.5?

Відповіді:


190

Це справді інформаційне повідомлення.

Ймовірно, ви робите OPTIMIZE на таблиці InnoDB (таблиця, що використовує механізм зберігання InnoDB, а не механізм зберігання MyISAM ).

InnoDB не підтримує OPTIMIZE так, як це робить MyISAM. Це робить щось інше. Він створює порожню таблицю і копіює в неї всі рядки з існуючої таблиці, по суті видаляє стару таблицю та перейменовує нову таблицю, а потім запускає АНАЛІЗ для збору статистики. Це найближче, що InnoDB може досягти, щоб зробити OPTIMIZE.

Повідомлення, яке ви отримуєте, - це в основному сервер MySQL, що повторює те, що сказав механізм зберігання InnoDB серверу MySQL:

Таблиця не підтримує оптимізацію - це механізм зберігання InnoDB, який говорить ...

"Я (механізм зберігання InnoDB) не виконую операцію ОПТИМІЗАЦІЯ, як це робить мій друг (механізм зберігання MyISAM)."

"робити відтворення + аналіз натомість" - це механізм зберігання InnoDB, який говорить ...

"Я вирішив виконати інший набір операцій, що дозволить досягти рівноцінного результату".


13
гаразд, не могли б ви поділитися різними способами, як ви робите.
Vikrant More

Я впевнений, що це десь є в Довідковому посібнику MySQL; це очікувана поведінка, і ні про що турбуватися. (За винятком того, що таблиця буде "заблокована" і буде недоступною, поки процес завершиться, що може зайняти деякий час для таблиці HUGH JASS.) Довідка: https://dev.mysql.com/doc/refman/5.5/ en / optimize-table.html Див. розділ "Інформація про InnoDB".
spencer7593

Ви також можете використовувати 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

1
Це не відтворює зовнішній ключ.
DanB

1

Кращий варіант - створити нову таблицю, скопіювати рядки до цільової таблиці, опустити фактичну таблицю та перейменувати щойно створену таблицю. Цей метод хороший для невеликих столиків,


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