Spec-Zone .ru
спецификации, руководства, описания, API
|
Условия диапазона на многократной части индексируют, расширение условий диапазона для единственной части, индексируют. Условие диапазона на многократной части индексирует, ограничивает, индексируют строки, чтобы лечь в пределах одного или нескольких ключевых интервалов кортежа. Ключевые интервалы кортежа определяются по ряду ключевых кортежей, используя упорядочивающий от индексирования.
Например, полагайте, что многократная часть индексирует определенный как key1(
, и следующий набор ключевых кортежей перечислял в
ключевом порядке: key_part1
, key_part2
, key_part3
)
key_part1
key_part2
key_part3
NULL 1 'abc' NULL 1 'xyz' NULL 2 'foo' 1 1 'abc' 1 1 'xyz' 1 2 'abc' 2 1 'aaa'
Условие
определяет этот
интервал: key_part1
= 1
(1,-inf,-inf) <= (key_part1
,key_part2
,key_part3
) < (1,+inf,+inf)
Интервал покрывает 4-ые, 5-ые, и 6-ые кортежи в предыдущем наборе данных и может использоваться методом доступа диапазона.
В отличие от этого, условие
не определяет единственный интервал и не может использоваться методом доступа диапазона. key_part3
=
'abc'
Следующие описания указывают, как работа условий диапазона для многократной части индексирует более подробно.
Для HASH
индексирует, каждый интервал, содержащий
идентичные значения, может использоваться. Это означает, что интервал может быть произведен только для
условий в следующей форме:
key_part1
cmp
const1
ANDkey_part2
cmp
const2
AND ...ANDkey_partN
cmp
constN
;
Здесь, const1
, const2
,
… являются константами, cmp
один из =
, <=>
, или IS NULL
операторы сравнения, и условия покрывают, все индексируют
части. (Таким образом, есть N
условия, один для каждой
части N
- часть индексируют.) Например, следующее является
условием диапазона для трехчастного HASH
индексируйте:
key_part1
= 1 ANDkey_part2
IS NULL ANDkey_part3
= 'foo'
Для определения какой, как полагают, константа, видит Раздел 8.13.1.1, "Метод доступа Диапазона для Единственной части Индексирует".
Для a BTREE
индексируйте, интервал мог бы быть
применимым для условий, объединенных с AND
, где каждое условие сравнивает ключевую роль с использованием
постоянной величины =
,
<=>
, IS NULL
, >
,
<
,
>=
, <=
, !=
, <>
, BETWEEN
, или LIKE '
(где pattern
''
не запускается с
подстановочного знака). Интервал может использоваться, пока возможно определить единственный ключевой
кортеж, содержащий все строки, которые соответствуют условие (или два интервала, если pattern
'<>
или !=
используется).
Оптимизатор пытается использовать дополнительные ключевые роли, чтобы определить интервал, пока
оператор сравнения =
, <=>
, или IS NULL
. Если оператор >
, <
, >=
, <=
, !=
, <>
, BETWEEN
, или LIKE
, оптимизатор использует это, но не рассматривает больше
ключевых ролей. Для следующего выражения, использования оптимизатора =
от первого сравнения. Это также использует >=
от второго сравнения, но не рассматривает дальнейших
ключевых ролей и не использует третье сравнение для конструкции интервала:
key_part1
= 'foo' ANDkey_part2
>= 10 ANDkey_part3
> 10
Единственный интервал:
('foo',10,-inf) < (key_part1
,key_part2
,key_part3
) < ('foo',+inf,+inf)
Возможно, что создаваемый интервал содержит больше строк чем начальное условие. Например, предыдущий
интервал включает значение ('foo', 11, 0)
, который не удовлетворяет
исходное условие.
Если условия, которые покрывают наборы строк, содержавших в пределах интервалов,
объединяются с OR
,
они формируют условие, которое покрывает ряд строк, содержавших в пределах объединения их интервалов.
Если условия объединяются с AND
, они формируют условие, которое покрывает ряд строк, содержавших
в пересечении их интервалов. Например, для этого условия на с двумя частями индексируйте:
(key_part1
= 1 ANDkey_part2
< 2) OR (key_part1
> 5)
Интервалы:
(1,-inf) < (key_part1
,key_part2
) < (1,2)(5,-inf) < (key_part1
,key_part2
)
В этом примере интервал на первой строке использует одну ключевую роль для связанного левого и две
ключевых роли для связанного права. Интервал на второй строке использует только одну ключевую роль.
key_len
столбец в EXPLAIN
вывод указывает на максимальную длину ключевого
используемого префикса.
В некоторых случаях, key_len
может указать, что ключевая роль
использовалась, но это могло бы быть не то, что Вы будете ожидать. Предположите это key_part1
и key_part2
может быть NULL
.
Затем key_len
столбец выводит на экран две длины ключевой роли для
следующего условия:
key_part1
>= 1 ANDkey_part2
< 2
Но, фактически, условие преобразовывается в это:
key_part1
>= 1 ANDkey_part2
IS NOT NULL
Раздел 8.13.1.1, "Метод доступа Диапазона для Единственной части Индексирует", описывает, как оптимизация выполняется, чтобы объединить или устранить интервалы для условий диапазона на единственной части, индексирует. Аналогичные шаги выполняются для условий диапазона на многократной части, индексирует.