Не используйте OPTIMIZE TABLE
для таблиц InnoDB - он дает небольшую, если таковая имеется, выгоду.
InnoDB страдает от некоторой фрагментации, но недостаточно, чтобы оправдать время простоядефрагментации.И данные снова быстро фрагментируются.
Основная причина фрагментации - «разбиение на блоки». Например, когда вы добавляете строку в блок размером 16 КБ, который является «полным», блок разделяется на две части.Скажем, 89 строк плюс 1 строка в одном блоке становятся, скажем, 45 строками в каждом из двух блоков.По мере того, как вы продолжаете вставлять строки, эти (и другие) блоки постепенно заполняются, пока они не разделятся снова.После многих таких вставок таблица заполняется примерно на 69%.
Итак, вы говорите, не сильно ли это замедлит процесс?Нет. Точечные запросы развертывают BTree - относительно постоянное время.Сканирование диапазона охватывает больше блоков, но количество сканируемых строк не изменяется.И т. Д.
Кроме того, InnoDB объединит два смежных блока, которые «слишком пусты», что позволит избежать (как правило) некоторых наихудших сценариев.Если вы DELETE
много строк, блоки могут быть довольно пустыми.Это «объединение» держит фрагментацию под контролем.
Если вы «фрагментируете», это относится к блокам, разбросанным по всему диску, то это не лечится OPTIMIZE TABLE
.И при любом разбиении блока будет использоваться новый блок из «где угодно».
UPDATE
находится где-то между INSERT
(текста в строке увеличивается) и DELETE
(если данные уменьшаются).
(есть еще много деталей, которые я пропустил.)