Spec-Zone.ru › MySQL 5.7

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

Чтение строк с использованием сканирования диапазона по вторичному индексу может привести к множеству случайных обращений к диску к основной таблице, если таблица большая и не хранится в кэше движка хранения. С помощью оптимизации многодиапазонного чтения (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. См. Раздел 8.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-5.7-en/mrr-optimization.html

Spec-Zone.ru

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