Spec-Zone .ru
спецификации, руководства, описания, API
|
Поскольку единственная часть индексирует, индексирует интервалы значения, может быть удобно представлен
соответствующими условиями в WHERE
пункт, таким образом, мы говорим об условиях диапазона, а не "интервалах".
Определение условия диапазона для единственной части индексирует, следующие:
Для обоих BTREE
и HASH
индексирует, сравнение ключевой роли с постоянной величиной является условием диапазона при
использовании =
,
<=>
, IN()
, IS NULL
,
или IS NOT NULL
операторы.
Дополнительно, для BTREE
индексирует, сравнение
ключевой роли с постоянной величиной является условием диапазона при использовании >
, <
, >=
, <=
, BETWEEN
, !=
, или <>
операторы, или LIKE
сравнения, если параметр LIKE
постоянная строка, которая не запускается с подстановочного
символа.
Для всех типов индексирует, многократные условия диапазона, объединенные с OR
или AND
сформируйте
условие диапазона.
"Постоянная величина" в предыдущих описаниях означает одно из следующего:
Вот некоторые примеры запросов с условиями диапазона в WHERE
пункт:
SELECT * FROM t1 WHEREkey_col
> 1 ANDkey_col
< 10;SELECT * FROM t1 WHEREkey_col
= 1 ORkey_col
IN (15,18,20);SELECT * FROM t1 WHEREkey_col
LIKE 'ab%' ORkey_col
BETWEEN 'bar' AND 'foo';
Отметьте, что некоторые непостоянные величины могут быть преобразованы в константы во время постоянной фазы распространения.
MySQL пытается извлечь условия диапазона из WHERE
пункт для каждого из возможных
индексирует. Во время процесса экстракции отбрасываются условия, которые не могут использоваться для того, чтобы
создать условие диапазона, условия, которые производят накладывающиеся диапазоны, объединяются, и условия,
которые производят пустые диапазоны, удаляются.
Рассмотрите следующий оператор, где key1
индексированный столбец и nonkey
не индексируется:
SELECT * FROM t1 WHERE (key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR (key1 < 'bar' AND nonkey = 4) OR (key1 < 'uux' AND key1 > 'z');
Процесс экстракции для ключа key1
следующие:
Запустите с исходного WHERE
пункт:
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR(key1 < 'bar' AND nonkey = 4) OR(key1 < 'uux' AND key1 > 'z')
Удалить nonkey = 4
и key1 LIKE
'%b'
потому что они не могут использоваться для сканирования диапазона. Корректный способ удалить
их состоит в том, чтобы заменить их TRUE
, так, чтобы мы не пропустили строк
соответствия, делая сканирование диапазона. Заменив их TRUE
, мы добираемся:
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR TRUE)) OR(key1 < 'bar' AND TRUE) OR(key1 < 'uux' AND key1 > 'z')
Условия коллапса, которые всегда являются истиной или ложью:
(key1 LIKE 'abcde%' OR TRUE)
всегда истина
(key1 < 'uux' AND key1 > 'z')
всегда
ложь
Заменяя эти условия константами, мы добираемся:
(key1 < 'abc' AND TRUE) OR (key1 < 'bar' AND TRUE) OR (FALSE)
Ненужное удаление TRUE
и FALSE
константы,
мы получаем:
(key1 < 'abc') OR (key1 < 'bar')
Комбинируя накладывающиеся интервалы в каждый приводит к заключительному условию, которое будет использоваться для сканирования диапазона:
(key1 < 'bar')
Вообще (и как демонстрирующийся предыдущим примером), условие, используемое для сканирования диапазона, является
менее рестриктивным чем WHERE
пункт. MySQL выполняет дополнительную проверку, чтобы
отфильтровать строки, которые удовлетворяют условие диапазона, но не полное WHERE
пункт.
Алгоритм экстракции условия диапазона может обработать вложенный AND
/OR
конструкции произвольной глубины, и ее вывод не зависят от порядка, в котором
условия появляются в WHERE
пункт.
В настоящий момент MySQL не поддерживает объединяющиеся многократные диапазоны для range
метод доступа для пространственного индексирует. Чтобы работать вокруг
этого ограничения, можно использовать a UNION
с идентичным SELECT
операторы, за исключением того, что Вы помещаете каждый пространственный предикат в различное SELECT
.