Spec-Zone .ru
спецификации, руководства, описания, API
|
Самый эффективный способ обработать GROUP BY
то, когда индексирование используется,
чтобы непосредственно получить группирующиеся столбцы. С этим методом доступа MySQL использует свойство
некоторых, индексируют типы, что ключи упорядочиваются (например, BTREE
). Это
свойство включает использованию групп поиска в индексировании, не имея необходимость рассматривать все ключи в
индексировании, которые удовлетворяют все WHERE
условия. Этот метод доступа
рассматривает только часть ключей в индексировании, таким образом, это вызывают, свободное
индексирует сканирование. Когда есть нет WHERE
пункт, свободное
индексирует чтения сканирования так много ключей как число групп, которые могут быть намного меньшим числом чем
тот из всех ключей. Если WHERE
пункт содержит предикаты диапазона (см. обсуждение
range
присоединитесь
вводят Раздел
8.8.1, "Оптимизируя Запросы с EXPLAIN
"), свободное индексируют
сканирование, ищет первый ключ каждой группы, которая удовлетворяет условия диапазона, и снова читает наименее
возможное число ключей. Это возможно при следующих условиях:
Запрос по единственной таблице.
GROUP BY
имена только столбцы, которые формируют
крайний левый префикс из индексирования и никаких других столбцов. (Если, вместо GROUP
BY
, у запроса есть a DISTINCT
пункт, все отличные атрибуты
обращаются к столбцам, которые формируют крайний левый префикс из индексирования.) Например, если
таблица t1
имеет индексирование на (c1,c2,c3)
,
свободный индексируют сканирование, применимо, если запрос имеет GROUP BY c1,
c2,
. Это не применимо, если запрос имеет GROUP BY c2, c3
(столбцы не являются крайним левым префиксом), или GROUP BY c1, c2, c4
(c4
не находится в индексировании).
Единственные агрегатные функции, используемые в списке выборки (если кто-либо), MIN()
и MAX()
, и все они
обращаются к тому же самому столбцу. Столбец должен быть в индексировании и должен следовать за
столбцами в GROUP BY
.
Любые другие части индексирования чем те от GROUP BY
ссылаемый в запросе должны быть константы (то есть, на них нужно сослаться в равенствах с константами),
за исключением параметра MIN()
или MAX()
функции.
Для столбцов в индексировании полные значения столбцов должны быть индексированы,
не только префикс. Например, с c1 VARCHAR(20), INDEX (c1(10))
,
индексирование не может использоваться для свободного, индексируют сканирование.
Если освобождено индексируйте сканирование, применимо к запросу, EXPLAIN
выходные шоу Using index for group-by
в
Extra
столбец.
Предположите, что есть индексирование idx(c1,c2,c3)
на таблице t1(c1,c2,c3,c4)
. Свободные индексируют метод доступа сканирования, может
использоваться для следующих запросов:
SELECT c1, c2 FROM t1 GROUP BY c1, c2;SELECT DISTINCT c1, c2 FROM t1;SELECT c1, MIN(c2) FROM t1 GROUP BY c1;SELECT c1, c2 FROM t1 WHERE c1 <const
GROUP BY c1, c2;SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 >const
GROUP BY c1, c2;SELECT c2 FROM t1 WHERE c1 <const
GROUP BY c1, c2;SELECT c1, c2 FROM t1 WHERE c3 =const
GROUP BY c1, c2;
Следующие запросы не могут быть выполнены с этим быстрым избранным методом по приведенным причинам:
Есть агрегатные функции кроме MIN()
или MAX()
:
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;
Столбцы в GROUP BY
пункт не формирует крайний левый
префикс из индексирования:
SELECT c1, c2 FROM t1 GROUP BY c2, c3;
Запрос обращается к части ключа, который прибывает после GROUP
BY
часть, и для которого нет никакого равенства с константой:
SELECT c1, c3 FROM t1 GROUP BY c1, c2;
Был запрос, чтобы включать WHERE c3 =
, свободный индексируют сканирование, мог
использоваться.const
Свободные индексируют метод доступа сканирования, может быть применен к другим формам ссылок агрегатной функции
в списке выборки, в дополнение к MIN()
и MAX()
ссылки уже поддерживали:
AVG(DISTINCT)
,
SUM(DISTINCT)
, и COUNT(DISTINCT)
поддерживаются. AVG(DISTINCT)
и SUM(DISTINCT)
возьмите единственный параметр. COUNT(DISTINCT)
может иметь параметр на больше чем один столбец.
Должен быть нет GROUP BY
или DISTINCT
пункт в запросе.
Свободные ограничения сканирования, описанные ранее все еще, применяются.
Предположите, что есть индексирование idx(c1,c2,c3)
на таблице t1(c1,c2,c3,c4)
. Свободные индексируют метод доступа сканирования, может
использоваться для следующих запросов:
SELECT COUNT(DISTINCT c1), SUM(DISTINCT c1) FROM t1;SELECT COUNT(DISTINCT c1, c2), COUNT(DISTINCT c2, c1) FROM t1;
Свободный индексируют сканирование, не применимо для следующих запросов:
SELECT DISTINCT COUNT(DISTINCT c1) FROM t1;SELECT COUNT(DISTINCT c1) FROM t1 GROUP BY c1;