MySQL innodb b-tree rebalance asyn c в фоновом режиме или окончательно sh при каждой операции записи, если требуется перебалансировка - PullRequest
1 голос
/ 24 февраля 2020

Мне просто интересно, когда mysql innodb выполняет операцию перебалансировки, когда это необходимо.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

«Перебалансировка» и «дефрагментация» тесно связаны. Для этого ответа я буду использовать термины взаимозаменяемо.

InnoDB никогда автоматически не перебалансирует весь BTree.

InnoDB при хранении «грязного» блока, может объединить этот один блок со смежным блоком, что приведет к небольшому изменению баланса. Блокировки другими потоками могут блокировать взаимодействие с этими блоками, тем самым откладывая действие.

InnoDB "никогда" не нуждается в полной перебалансировке; его BTrees "достаточно сбалансированы" для большинства видов использования. Кроме того, выгода от полной рефрагментации ничтожна по сравнению со стоимостью. В прошлом это была полная копия данных BTree и / или индекса BTree. Более новые ALTER «алгоритмы» могут сделать это INPLACE (или что угодно). Если вы настаиваете на перебалансировке, предоставьте статистику до и после, чтобы продемонстрировать, какую выгоду вы получаете.

Удаление большей части таблицы происходит медленно и оставляет таблицу довольно фрагментированной. Обычно лучше скопировать строки в keep . Это имеет эффект дефрагментации "бесплатно". И это работает быстрее. Больше о «большом» удалении: http://mysql.rjweb.org/doc.php/deletebig

Возможно, BTree InnoDB никогда не являются «несбалансированными» в том смысле, что глубина (я думаю) постоянна по всему дереву. Однако любой блок может стать менее чем полным. Когда неконечные узлы становятся менее заполненными, это наклоняет BTree. Следовательно, вы можете утверждать, что эта «фрагментация» вызывает «дисбаланс»?

«Буфер изменений» ставит в очередь обновления не-1028 * индекса для «отложенной» записи. Это позволяет более эффективно выполнять обновления индекса, что в некоторой степени выгодно для любой локальной очистки BTree.

0 голосов
/ 25 февраля 2020

InnoDB должен обновлять B-дерево синхронно (во время вашего INSERT / UPDATE / DELETE), если индекс является UNIQUE KEY или PRIMARY KEY.

В противном случае, для неуникальных индексов, изменения записываются в InnoDB буфер изменений . Они дополняют B-дерево для индекса.

Изменения объединяются в B-дерево либо в следующий раз, когда чей-то запрос читает эти элементы индекса, либо в конечном итоге они объединяются «потоком слияния». Кроме того, InnoDB имеет опцию «медленное отключение», которая полностью объединяет все записи буфера изменений, ожидающие изменения в момент выключения MySQL Сервер.

...