10.2.1.11 Оптимизация многодиапазонного чтения
Чтение строк с помощью сканирования диапазона по вторичному индексу может привести к множеству случайных обращений к основной таблице при большой таблице, не хранящейся в кэше движка хранения. С помощью оптимизации многодиапазонного чтения (MRR) MySQL пытается уменьшить количество случайных обращений к диску при сканировании диапазона, сначала просканировав только индекс и собрав ключи для соответствующих строк. Затем ключи сортируются, и, наконец, строки извлекаются из основной таблицы в порядке первичного ключа. Мотивация для Disk-sweep MRR заключается в сокращении количества случайных обращений к диску и достижении вместо этого более последовательного сканирования данных основной таблицы.
Оптимизация многодиапазонного чтения предоставляет следующие преимущества:
MRR позволяет получать доступ к строкам данных последовательно, а не случайным образом, на основе кортежей индекса. Сервер получает набор кортежей индекса, удовлетворяющих условиям запроса, сортирует их по порядку идентификаторов строк данных и использует отсортированные кортежи для извлечения строк данных в порядке. Это делает доступ к данным более эффективным и менее дорогостоящим.
MRR позволяет выполнять пакетную обработку запросов для доступа к ключам для операций, требующих доступа к строкам данных через кортежи индекса, таких как сканирование диапазона индексов и равнообъединения, использующие индекс для атрибута объединения. MRR перебирает последовательность диапазонов индекса для получения квалифицирующих кортежей индекса. По мере накопления этих результатов они используются для доступа к соответствующим строкам данных. Нет необходимости получать все кортежи индекса, прежде чем начать чтение строк данных.
Оптимизация MRR не поддерживается с вторичными индексами, созданными на виртуальных сгенерированных столбцах. InnoDB поддерживает вторичные индексы на виртуальных сгенерированных столбцах.
Следующие сценарии иллюстрируют, когда оптимизация MRR может быть выгодной:
Сценарий A: MRR может использоваться для InnoDB и MyISAM таблиц для сканирования диапазонов индексов и операций равнообъединения.
Часть кортежей индекса накапливается в буфере.
Кортежи в буфере сортируются по идентификатору строки данных.
Строки данных обращаются в соответствии с отсортированной последовательностью кортежей индекса.
Сценарий B: MRR может использоваться для NDB таблиц для сканирования индексов с несколькими диапазонами или при выполнении равнообъединения по атрибуту.
Часть диапазонов, возможно, одноключевые диапазоны, накапливается в буфере на центральном узле, где отправляется запрос.
Диапазоны отправляются на узлы выполнения, которые обращаются к строкам данных.
Обработанные строки упаковываются в пакеты и отправляются обратно на центральный узел.
Полученные пакеты со строками данных помещаются в буфер.
Строки данных считываются из буфера.
Когда используется 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.