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

8.13.1.1. Метод доступа Диапазона для Единственной части Индексирует

Поскольку единственная часть индексирует, индексирует интервалы значения, может быть удобно представлен соответствующими условиями в WHERE пункт, таким образом, мы говорим об условиях диапазона, а не "интервалах".

Определение условия диапазона для единственной части индексирует, следующие:

"Постоянная величина" в предыдущих описаниях означает одно из следующего:

Вот некоторые примеры запросов с условиями диапазона в WHERE пункт:

SELECT * FROM t1  WHERE key_col > 1  AND key_col < 10;SELECT * FROM t1  WHERE key_col = 1  OR key_col IN (15,18,20);SELECT * FROM t1  WHERE key_col LIKE 'ab%'  OR key_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 следующие:

  1. Запустите с исходного WHERE пункт:

    (key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR(key1 < 'bar' AND nonkey = 4) OR(key1 < 'uux' AND key1 > 'z')
  2. Удалить 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')
  3. Условия коллапса, которые всегда являются истиной или ложью:

    • (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')
  4. Комбинируя накладывающиеся интервалы в каждый приводит к заключительному условию, которое будет использоваться для сканирования диапазона:

    (key1 < 'bar')

Вообще (и как демонстрирующийся предыдущим примером), условие, используемое для сканирования диапазона, является менее рестриктивным чем WHERE пункт. MySQL выполняет дополнительную проверку, чтобы отфильтровать строки, которые удовлетворяют условие диапазона, но не полное WHERE пункт.

Алгоритм экстракции условия диапазона может обработать вложенный AND/OR конструкции произвольной глубины, и ее вывод не зависят от порядка, в котором условия появляются в WHERE пункт.

В настоящий момент MySQL не поддерживает объединяющиеся многократные диапазоны для range метод доступа для пространственного индексирует. Чтобы работать вокруг этого ограничения, можно использовать a UNION с идентичным SELECT операторы, за исключением того, что Вы помещаете каждый пространственный предикат в различное SELECT.