Spec-Zone .ru
спецификации, руководства, описания, API
|
Чтение строк, используя сканирование диапазона на вторичном устройстве индексирует, может привести ко многим случайным доступам к диску к базовой таблице, когда таблица является большой и не сохраненная в кэше механизма хранения. С Дисковой разверткой Многодиапазонное Чтение (MRR) оптимизация MySQL пытается сократить количество случайного доступа к диску для сканирований диапазона первым сканированием индексирования только и сбором ключей для соответствующих строк. Затем ключи сортируются, и наконец строки получаются из базовой таблицы, используя порядок первичного ключа. Побуждение для Дисковой развертки MRR должно сократить количество случайных доступов к диску и вместо этого достигнуть более последовательного сканирования данных базовой таблицы.
Многодиапазонная оптимизация Чтения предоставляет эти преимущества:
MRR позволяет строкам данных быть полученными доступ последовательно, а не в произвольном порядке, основанный на индексируют кортежи. Сервер получает ряд, индексируют кортежи, которые удовлетворяют условия запроса, сортирует их согласно порядку ID строки данных, и использует сортированные кортежи, чтобы получить строки данных в порядке. Это делает доступ к данным более эффективным и менее дорогим.
MRR включает пакетной обработке запросов на ключевой доступ для операций, которые требуют, чтобы доступ к строкам данных через индексировал кортежи, такие как диапазон индексируют сканирования и объединения по эквивалентности, которые используют индексирование для атрибута соединения. MRR выполняет итерации по последовательности, индексируют диапазоны, чтобы получить квалификацию, индексируют кортежи. Поскольку эти результаты накапливаются, они используются, чтобы получить доступ к соответствующим строкам данных. Не необходимо получить, все индексируют кортежи прежде, чем начать читать строки данных.
Следующие сценарии иллюстрируют, когда оптимизация MRR может быть выгодной:
Сценарий A: MRR может использоваться для InnoDB
и MyISAM
таблицы для индексируют сканирования диапазона и операции объединения по
эквивалентности.
Часть индексировать кортежей накапливается в буфере.
Кортежи в буфере сортируются их ID строки данных.
К строкам данных получают доступ согласно сортированному, индексируют последовательность кортежа.
Сценарий B: MRR может использоваться для NDB
таблицы для многократного диапазона индексируют сканирования или выполняя
объединение по эквивалентности атрибутом.
Часть диапазонов, возможно единственные диапазоны ключей, накапливается в буфере на центральном узле, где запрос представляется.
Диапазоны отправляются узлам выполнения те данные доступа строки.
Строки, к которым получают доступ, упаковываются в пакеты и отсылаются назад к центральному узлу.
Полученные пакеты со строками данных помещаются в буфер.
Строки данных читаются из буфера.
Когда MRR используется, Extra
столбец в EXPLAIN
выходные шоу Using MRR
.
InnoDB
и MyISAM
не используйте MRR, если к полным
строкам таблицы нельзя получить доступ, чтобы привести к результату запроса. Дело обстоит так, если к
результатам можно привести полностью на основе на информации в индексировать кортежах (посредством покрытия, индексируют);
MRR не предоставляет преимущества.
Запрос в качестве примера, для которого MRR может использоваться, предполагая, что есть индексирование на (
:
key_part1
, key_part2
)
SELECT * FROM t WHEREkey_part1
>= 1000 ANDkey_part1
< 2000 ANDkey_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
байты и определяют число диапазонов, чтобы обработать в
единственной передаче.