Помните, что OPTIMIZE TABLE не выполняет дефрагментацию. Внутри OPTIMIZE TABLE выполняет несколько операций (копирование данных во временный файл, воссоздание индексов, перерасчет статистики индекса). На самом деле, приведенный мной пример можно выполнить вручную, как показано на рисунке.
Пример: если вы оптимизируете mydb.mytable, вы вводите эту команду:
OPTIMIZE TABLE mydb.mytable;
Обратите внимание, что mysql выполняет что-то следующее под капотом:
CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;
Это очень полезно для таблиц с большим количеством ОБНОВЛЕНИЙ и УДАЛЕНИЙ
Выполнение этого может выполнить две вещи
Запрещает mysql просматривать фрагменты в таблице при попытке загрузить данные во фрагменты нужного размера. Удаление этих фрагментов уменьшит эту операцию.
Пересчет статистики индекса помогает MySQL Query Optimizer строить лучшие планы EXPLAIN. В противном случае запросы могут ухудшиться во время выполнения, поскольку MySQL Query Optimizer решил ошибиться в плане EXPLAIN. Это было бы явным признаком таблицы с большим объемом ОБНОВЛЕНИЙ и УДАЛЕНИЙ.
ПРЕДОСТЕРЕЖЕНИЕ
Что касается кеширования, то кеширование быстро выполняется из-за полного сканирования таблицы. Для страниц индекса MyISAM вход и выход из кэша ключей MyISAM. Для InnoDB страницы данных и индексов входят и выходят из пула буферов InnoDB.