Spec-Zone.ru › MySQL 8.4

10.2.1.11 Оптимизация многодиапазонного чтения

Чтение строк с помощью сканирования диапазона по вторичному индексу может привести к множеству случайных обращений к основной таблице, когда таблица большая и не хранится в кэше движка хранения. С помощью оптимизации многодиапазонного чтения (MRR) MySQL пытается уменьшить количество случайных обращений к диску при сканировании диапазона, сначала сканируя только индекс и собирая ключи для соответствующих строк. Затем ключи сортируются, а затем строки извлекаются из основной таблицы в порядке первичного ключа. Целью оптимизации Disk-sweep MRR является сокращение количества случайных обращений к диску и вместо этого достижение более последовательного сканирования данных основной таблицы.

Оптимизация многодиапазонного чтения предоставляет следующие преимущества:

  • MRR позволяет обращаться к данным строк последовательно, а не в случайном порядке, на основе кортежей индекса. Сервер получает набор кортежей индекса, удовлетворяющих условиям запроса, сортирует их в порядке идентификатора строки данных и использует отсортированные кортежи для извлечения строк данных в порядке. Это повышает эффективность и снижает затраты на доступ к данным.

  • MRR позволяет обрабатывать запросы на доступ к ключу для операций, которые требуют доступа к строкам данных через кортежи индекса, такие как сканирование диапазона индекса и равносоединения, которые используют индекс для атрибута соединения. MRR перебирает последовательность диапазонов индекса для получения соответствующих кортежей индекса. По мере накопления этих результатов они используются для доступа к соответствующим строкам данных. Нет необходимости получать все кортежи индекса, прежде чем начать чтение строк данных.

Оптимизация MRR не поддерживается для вторичных индексов, созданных на виртуальных сгенерированных столбцах. InnoDB поддерживает вторичные индексы на виртуальных сгенерированных столбцах.

Следующие сценарии иллюстрируют, когда оптимизация MRR может быть выгодна:

Сценарий A: MRR можно использовать для InnoDB и MyISAM таблиц для сканирования диапазона индекса и операций равносоединения.

  1. Часть кортежей индекса накапливается в буфере.

  2. Кортежи в буфере сортируются по идентификатору строки данных.

  3. Строки данных извлекаются в соответствии с отсортированной последовательностью кортежей индекса.

Сценарий B: MRR можно использовать для NDB таблиц для сканирования индексов нескольких диапазонов или при выполнении равносоединения по атрибуту.

  1. Часть диапазонов, возможно, одноключевых диапазонов, накапливается в буфере на центральном узле, где подается запрос.

  2. Диапазоны отправляются узлам выполнения, которые обращаются к строкам данных.

  3. Обработанные строки упаковываются в пакеты и отправляются обратно на центральный узел.

  4. Полученные пакеты со строками данных помещаются в буфер.

  5. Строки данных считываются из буфера.

Когда используется MRR, столбец Extra в выходных данных EXPLAIN показывает Using MRR.

InnoDB и MyISAM не используют MRR, если для получения результата запроса не требуется доступ к полным строкам таблицы. Это случай, если результаты могут быть получены полностью на основе информации в кортежах индекса (через ); MRR не предоставляет преимуществ.

Два флага системной переменной optimizer_switch предоставляют интерфейс для использования оптимизации MRR. Флаг mrr управляет включением MRR. Если mrr включен (on), флаг mrr_cost_based управляет тем, пытается ли оптимизатор сделать выбор на основе затрат между использованием и неиспользованием MRR (on) или использует MRR всякий раз, когда это возможно (off). По умолчанию mrr равен on, а mrr_cost_based равен on. См. Раздел 10.9.2, «Переключаемые оптимизации».

Для MRR движок хранения использует значение системной переменной read_rnd_buffer_size в качестве руководства для того, сколько памяти можно выделить для своего буфера. Движок использует до read_rnd_buffer_size байт и определяет количество диапазонов для обработки за один проход.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/mrr-optimization.html

Spec-Zone.ru

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