Преимущества выполнения запроса OPTIMIZE TABLE в MySQL DB Server

9

Я хотел бы знать, какие преимущества [действительно практические] можно получить, запустив OPTIMIZE TABLE tbl_nameзапрос в MySQL Server.

Я проверил это один раз и обнаружил, что после того, как это будет выполнено, следующее попадание в БД может занять много времени из-за перемещения фрагментов или около того, но последующие попадания показывают вид производительности, я не уверен, что кеширование запросов делает этот трюк с одной только оптимизацией или оптимизацией делает этот трюк.

Может ли кто-нибудь подсказать мне реальные значения разницы в производительности, если это возможно, чтобы я мог продолжить, поскольку работа с MySQL набирает силу в нашем проекте.

Saravanan
источник

Ответы:

7

Помните, что 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;

Это очень полезно для таблиц с большим количеством ОБНОВЛЕНИЙ и УДАЛЕНИЙ

Выполнение этого может выполнить две вещи

  1. Запрещает mysql просматривать фрагменты в таблице при попытке загрузить данные во фрагменты нужного размера. Удаление этих фрагментов уменьшит эту операцию.

  2. Пересчет статистики индекса помогает MySQL Query Optimizer строить лучшие планы EXPLAIN. В противном случае запросы могут ухудшиться во время выполнения, поскольку MySQL Query Optimizer решил ошибиться в плане EXPLAIN. Это было бы явным признаком таблицы с большим объемом ОБНОВЛЕНИЙ и УДАЛЕНИЙ.

ПРЕДОСТЕРЕЖЕНИЕ

Что касается кеширования, то кеширование быстро выполняется из-за полного сканирования таблицы. Для страниц индекса MyISAM вход и выход из кэша ключей MyISAM. Для InnoDB страницы данных и индексов входят и выходят из пула буферов InnoDB.

RolandoMySQLDBA
источник
Спасибо за ответ. С вашей точки зрения, я понимаю, что мне лучше использовать какой-нибудь сервис, например, работу cron, чтобы запланировать оптимизацию таблицы для одной из моих часто обновляемых таблиц, чтобы я мог достичь лучшей производительности. В дополнение к этому я использую InnoDB для этой таблицы. Это лучший выбор. Кроме того, я обнаружил, что HASH-соединения в SQL Server были предложены для повышения производительности запросов. Не могли бы вы объяснить это для меня и как получить аналогичное в MySQL. Также, пожалуйста, дайте мне оптимизатор запросов SQL для MySQL [версия для Windows7].
Сараванан
@savaranan: Оптимизатор запросов MySQL, о котором я говорил, был внутренним, встроенным в MySQL. Кстати, поскольку таблица, которую вы хотите оптимизировать, называется InnoDB, вы можете пропустить шаги DISABLE KEYS и ENABLE KEYS. Кроме того, ANALYZE TABLE может быть пропущен, потому что он абсолютно бесполезен для таблиц InnoDB, поскольку InnoDB пересчитывает количество элементов в своей таблице путем близких приближений, используя страницы из индексов BTREE, которые называются погружениями индекса.
RolandoMySQLDBA
@savaranan: Что касается HASH-индексов, InnoDB имеет адаптивные хеш-индексы ( dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html ). Есть также хорошие предложения по эмуляции ваших собственных хеш-индексов и обработке коллизий, основанные на страницах 103-106 «Высокопроизводительного MySQL» ( amazon.com/dp/0596101716 )
RolandoMySQLDBA