14.8.3.3 Устойчивость к сканированию буфера пула
Вместо использования строгого алгоритма, InnoDB использует технику минимизации объема данных, которые загружаются в буфер и никогда больше не используются. Цель состоит в том, чтобы гарантировать, что часто используемые (“активные”) страницы остаются в буфере пуле, даже когда и загружают новые блоки, которые могут или могут не быть использованы позже.
Новые блоки, которые были прочитаны, вставляются в середину списка LRU. Все новые страницы вставляются по умолчанию в позицию, находящуюся на расстоянии 3/8 от хвоста списка LRU. Страницы перемещаются в начало списка (конец «последнего использования») при первом доступе к ним в буферном пуле. Таким образом, страницы, к которым никогда не обращались, никогда не попадают в начало списка LRU и «вытесняются» быстрее, чем при использовании строгого подхода LRU. Такое расположение разделяет список LRU на два сегмента, где страницы, расположенные за точкой вставки, считаются «старыми» и являются желаемыми жертвами для вытеснения из LRU.
Подробное описание внутренней работы буферного пула InnoDB и подробности алгоритма LRU см. в разделе 14.5.1 «Буферный пул».
Вы можете управлять точкой вставки в списке LRU и выбрать, применяет ли InnoDB ту же оптимизацию к блокам, загружаемым в буферный пул с помощью сканирования таблиц или индексов. Параметр конфигурации innodb_old_blocks_pct контролирует процент «старых» блоков в списке LRU. Значение по умолчанию для innodb_old_blocks_pct составляет 37, что соответствует исходному фиксированному соотношению 3/8. Диапазон значений составляет 5 (новые страницы в буферном пуле очень быстро вытесняются) до 95 (только 5% буферного пула зарезервировано для активных страниц, что приближает алгоритм к стандартной стратегии LRU).
Оптимизация, которая предотвращает переполнение буферного пула за счет предварительной загрузки, может предотвратить аналогичные проблемы, связанные со сканированием таблиц или индексов. При таких сканированиях страница данных, как правило, несколько раз быстро подряд используется и больше никогда не обрабатывается. Параметр конфигурации innodb_old_blocks_time определяет временной интервал (в миллисекундах) после первого доступа к странице, в течение которого к ней можно обратиться без перемещения в начало (конец «последнего использования») списка LRU. Значение по умолчанию для innodb_old_blocks_time равно 1000. Увеличение этого значения делает все больше и больше блоков склонными к более быстрому вытеснению из буферного пула.
И innodb_old_blocks_pct, и innodb_old_blocks_time можно указать в файле опций MySQL (my.cnf или my.ini) или изменить во время работы с помощью оператора SET
GLOBAL. Изменение значения во время работы требует привилегий, достаточных для установки глобальных системных переменных. См. раздел 5.1.8.1 «Привилегии на системные переменные».
Чтобы оценить влияние установки этих параметров, команда SHOW ENGINE INNODB STATUS сообщает статистику буферного пула. Подробности см. в разделе «Мониторинг буферного пула с помощью стандартного монитора InnoDB».
Поскольку воздействие этих параметров может сильно различаться в зависимости от вашей конфигурации оборудования, данных и особенностей рабочей нагрузки, всегда проводите тестирование для подтверждения эффективности перед изменением этих настроек в любой критически важной или производственной среде.
В смешанных рабочих нагрузках, где большая часть активности — это запросы типа OLTP с периодическими пакетными отчетами, которые приводят к большим сканированиям, установка значения innodb_old_blocks_time во время пакетных запусков может помочь сохранить рабочую область обычной рабочей нагрузки в буферном пуле.
При сканировании больших таблиц, которые не могут полностью поместиться в буферный пул, установка innodb_old_blocks_pct на малое значение позволяет данным, которые читаются только один раз, не потреблять значительную часть буферного пула. Например, установка innodb_old_blocks_pct=5 ограничивает эти данные, которые читаются только один раз, 5% буферного пула.
При сканировании небольших таблиц, которые помещаются в память, накладные расходы на перемещение страниц в буферном пуле меньше, поэтому вы можете оставить innodb_old_blocks_pct на значении по умолчанию или даже выше, например, innodb_old_blocks_pct=50.
Влияние параметра innodb_old_blocks_time предсказать сложнее, чем параметр innodb_old_blocks_pct, оно относительно невелико и больше зависит от рабочей нагрузки. Для получения оптимального значения проведите собственные тесты, если улучшение производительности от изменения innodb_old_blocks_pct недостаточно.
© 2025 Oracle
Licensed under the GPLv2 License.