Spec-Zone.ru › MySQL 9.2

17.8.3.3 Стойкость к сканированию буфера пула

Вместо использования строгого алгоритма, InnoDB использует технику для минимизации объема данных, которые загружаются в и никогда больше не используются. Цель состоит в том, чтобы убедиться, что часто используемые (“горячие”) страницы остаются в буферном пуле, даже когда и загружают новые блоки, которые могут или не могут быть использованы позже.

Новые блоки, которые были прочитаны, вставляются в середину списка LRU. Все недавно прочитанные страницы вставляются в позицию, которая по умолчанию находится 3/8 от хвоста списка LRU. Страницы перемещаются в начало списка (конец недавно используемых) при первом обращении к ним в буферном пуле. Таким образом, страницы, к которым никогда не обращались, никогда не попадают в переднюю часть списка LRU и «выбывают» быстрее, чем при строгом подходе LRU. Эта организация делит список LRU на два сегмента, где страницы ниже точки вставки считаются «старыми» и являются желаемыми жертвами для вытеснения LRU.

Для объяснения внутренней работы буферного пула InnoDB и особенностей алгоритма LRU см. Раздел 17.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. Изменение значения во время выполнения требует привилегий, достаточных для установки глобальных системных переменных. См. Раздел 7.1.9.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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/innodb-performance-midpoint_insertion.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API