|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Условия диапазона на многократной части индексируют, расширение условий диапазона для единственной части, индексируют. Условие диапазона на многократной части индексирует, ограничивает, индексируют строки, чтобы лечь в пределах одного или нескольких ключевых интервалов кортежа. Ключевые интервалы кортежа определяются по ряду ключевых кортежей, используя упорядочивающий от индексирования.
Например, полагайте, что многократная часть индексирует определенный как key1(, и следующий набор ключевых кортежей перечислял в
ключевом порядке: key_part1, key_part2, key_part3)
key_part1key_part2key_part3NULL 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_part1cmpconst1ANDkey_part2cmpconst2AND ...ANDkey_partNcmpconstN;
Здесь, const1, const2,
… являются константами, cmp один из =, <=>, или IS NULL операторы сравнения, и условия покрывают, все индексируют
части. (Таким образом, есть N условия, один для каждой
части N- часть индексируют.) Например, следующее является
условием диапазона для трехчастного HASH индексируйте:
key_part1= 1 ANDkey_part2IS 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_part2IS NOT NULL
Раздел 8.13.1.1, "Метод доступа Диапазона для Единственной части Индексирует", описывает, как оптимизация выполняется, чтобы объединить или устранить интервалы для условий диапазона на единственной части, индексирует. Аналогичные шаги выполняются для условий диапазона на многократной части, индексирует.