Spec-Zone .ru
спецификации, руководства, описания, API

8.13.11. Многодиапазонная Оптимизация Чтения

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

Многодиапазонная оптимизация Чтения предоставляет эти преимущества:

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

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

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

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

  3. К строкам данных получают доступ согласно сортированному, индексируют последовательность кортежа.

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

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

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

  3. Строки, к которым получают доступ, упаковываются в пакеты и отсылаются назад к центральному узлу.

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

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

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

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

Запрос в качестве примера, для которого MRR может использоваться, предполагая, что есть индексирование на (key_part1, key_part2):

SELECT * FROM t  WHERE key_part1 >= 1000 AND key_part1 < 2000  AND key_part2 = 10000;

Индексирование состоит из кортежей (key_part1, key_part2) значения, упорядоченные сначала key_part1 и затем key_part2.

Без MRR индексировать сканирование покрывает, все индексируют кортежи для key_part1 диапазон от 1000 до 2000, независимо от key_part2 значение в этих кортежах. Сканирование делает дополнительную работу до такой степени, что кортежи в диапазоне содержат key_part2 значения кроме 10000.

С MRR сканирование разбивается в многократные диапазоны, каждого для единственного значения key_part1 (1000, 1001..., 1999). Каждое из этих сканирований должно только искать кортежи с key_part2 = 10000. Если индексирование содержит много кортежей для который key_part2 не 10000, результаты MRR во многих, меньше индексируют считанные кортежи.

Чтобы выразить эту нотацию интервала использования, сканирование non-MRR должно исследовать индексировать диапазон [{1000, 10000}, {2000, MIN_INT}), который может включать много кортежей кроме тех для который key_part2 = 10000. Сканирование MRR исследует многократные интервалы единственной точки [{1000, 10000}], ..., [{1999, 10000}], который включает только кортежи с key_part2 = 10000.

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

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