MySQL оптимизировать innodb - не работает после нескольких часов - PullRequest
0 голосов
/ 30 мая 2018
services.profile      optimize        note    Table does not support optimize, doing recreate + analyze instead
services.profile      optimize        error   Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
services.profile      optimize        status  Operation failed

Таблица размером 300 ГБ с индексами.

Переменная mysql жалуется после работы в течение 3 ЧАСОВ:

innodb_online_alter_log_max_size        5500000000

Таблица не записывается более чем несколькимМБ за это время.

В чем проблема innodb / mysql, что простой ОПТИМИЗАЦИЯ таблицы 300 ГБ завершается неудачно после 3 часов "работы", поскольку буфер 5,5 ГБ заполнен ?? ?? 1009 *

1 Ответ

0 голосов
/ 31 мая 2018

Не используйте OPTIMIZE TABLE для таблиц InnoDB - он дает небольшую, если таковая имеется, выгоду.

InnoDB страдает от некоторой фрагментации, но недостаточно, чтобы оправдать время простоядефрагментации.И данные снова быстро фрагментируются.

Основная причина фрагментации - «разбиение на блоки». Например, когда вы добавляете строку в блок размером 16 КБ, который является «полным», блок разделяется на две части.Скажем, 89 строк плюс 1 строка в одном блоке становятся, скажем, 45 строками в каждом из двух блоков.По мере того, как вы продолжаете вставлять строки, эти (и другие) блоки постепенно заполняются, пока они не разделятся снова.После многих таких вставок таблица заполняется примерно на 69%.

Итак, вы говорите, не сильно ли это замедлит процесс?Нет. Точечные запросы развертывают BTree - относительно постоянное время.Сканирование диапазона охватывает больше блоков, но количество сканируемых строк не изменяется.И т. Д.

Кроме того, InnoDB объединит два смежных блока, которые «слишком пусты», что позволит избежать (как правило) некоторых наихудших сценариев.Если вы DELETE много строк, блоки могут быть довольно пустыми.Это «объединение» держит фрагментацию под контролем.

Если вы «фрагментируете», это относится к блокам, разбросанным по всему диску, то это не лечится OPTIMIZE TABLE.И при любом разбиении блока будет использоваться новый блок из «где угодно».

UPDATE находится где-то между INSERT (текста в строке увеличивается) и DELETE (если данные уменьшаются).

(есть еще много деталей, которые я пропустил.)

...