17.6.2.3 Построение индексов с сортировкой
InnoDB выполняет массовую загрузку вместо вставки одной записи индекса за раз при создании или перестроении индексов. Этот метод создания индекса также известен как построение индекса с сортировкой. Построение индексов с сортировкой не поддерживается для пространственных индексов.
Построение индекса состоит из трех фаз. На первой фазе происходит сканирование , и записи индекса генерируются и добавляются в буфер сортировки. Когда буфер сортировки заполняется, записи сортируются и записываются во временный промежуточный файл. Этот процесс также называется “циклом”. На второй фазе, после записи одного или нескольких циклов во временный промежуточный файл, выполняется сортировка слиянием всех записей в файле. На третьей и заключительной фазе отсортированные записи вставляются в ; эта заключительная фаза многопоточная.
До появления построения индексов с сортировкой записи индекса вставлялись в B-дерево по одной записи за раз с использованием API вставки. Этот метод включал открытие B-дерева для поиска позиции вставки, а затем вставку записей в страницу B-дерева с помощью вставки . Если вставка завершилась неудачей из-за того, что страница была заполнена, выполнялась вставка в , которая включает открытие курсора B-дерева и разделение и слияние узлов B-дерева по мере необходимости для поиска места для записи. Недостатки этого метода “сверху вниз” для построения индекса заключаются в затратах на поиск позиции вставки и постоянном разделении и слиянии узлов B-дерева.
Построение индексов с сортировкой использует подход “снизу вверх” для построения индекса. В этом подходе ссылка на правую крайнюю страницу листа хранится на всех уровнях B-дерева. Правая крайняя страница листа на необходимом уровне B-дерева выделяется, и записи вставляются в соответствии с их отсортированным порядком. После заполнения страницы листа указатель узла добавляется к родительской странице, и выделяется страница листа-близнеца для следующей вставки. Этот процесс продолжается до тех пор, пока все записи не будут вставлены, что может привести к вставкам до корневого уровня. При выделении страницы-близнеца ссылка на ранее закрепленную страницу листа освобождается, и вновь выделенная страница листа становится правой крайней страницей листа и новым местом вставки по умолчанию.
Выделение места в странице B-дерева для будущего роста индекса
Для резервирования места под будущий рост индекса вы можете использовать переменную innodb_fill_factor для резервирования процента места в странице B-дерева. Например, установка innodb_fill_factor на 80 резервирует 20 процентов пространства в страницах B-дерева во время построения индекса с сортировкой. Это значение применяется к страницам листа и не-листа B-дерева. Оно не применяется к внешним страницам, используемым для TEXT или BLOB записей. Зарезервированное пространство может не совпадать с настроенным значением, так как значение innodb_fill_factor интерпретируется как подсказка, а не как жесткое ограничение.
Построение индексов с сортировкой и поддержка полнотекстового поиска
Построение индексов с сортировкой поддерживается для . Ранее для вставки записей в полнотекстовый индекс использовался SQL.
Построение индексов с сортировкой и сжатые таблицы
Для , предыдущий метод создания индексов добавлял записи как в сжатые, так и в несжатые страницы. Когда журнал изменений (представляющий свободное место на сжатой странице) заполнялся, сжатая страница пересжималась. Если сжатие завершалось неудачей из-за нехватки места, страница разделялась. При построении индексов с сортировкой записи добавляются только в несжатые страницы. Когда несжатая страница заполняется, она сжимается. Используется адаптивное заполнение для обеспечения успешного сжатия в большинстве случаев, но если сжатие завершится неудачей, страница разделится, и попытка сжатия будет повторена. Этот процесс продолжается до тех пор, пока сжатие не завершится успешно. Дополнительную информацию о сжатии страниц B-дерева см. в Разделе 17.9.1.5, «Как работает сжатие для таблиц InnoDB».
Построение индексов с сортировкой и журналирование redo
отключается во время построения индекса с сортировкой. Вместо этого используется , чтобы обеспечить устойчивость построения индекса к неожиданному выходу или ошибке. Точка проверки вынуждает запись всех измененных страниц на диск. Во время построения индекса с сортировкой поток периодически получает сигнал для сброса для обеспечения быстрого выполнения операции проверки. Обычно поток очистки страниц сбрасывает измененные страницы, когда количество чистых страниц падает ниже установленного порога. При построении индексов с сортировкой измененные страницы сбрасываются незамедлительно, чтобы уменьшить накладные расходы на проверку и распараллелить работу ввода-вывода и ЦП.
Построение индексов с сортировкой и статистика оптимизатора
Построение индексов с сортировкой может привести к статистике, отличающейся от той, что генерируется предыдущим методом создания индекса. Различие в статистике, которое не должно влиять на производительность рабочей нагрузки, обусловлено использованием другого алгоритма заполнения индекса.
© 2025 Oracle
Licensed under the GPLv2 License.