Мариадб Строит лучший ИНДЕКС для данного SELECT - GROUP BY - PullRequest
0 голосов
/ 03 мая 2019

У меня мало знаний в базе данных.
Для учебы я читаю индексные документы MariaDB.
Но есть части, которые я не понимаю.

Документ

Алгоритм, шаг 2b (GROUP BY) ¶

WHERE aaa = 123 AND bbb = 1 GROUP BY ccc ⇒ INDEX(bbb, aaa, ccc) or INDEX(aaa, bbb, ccc) (='s first, in any order; then the GROUP BY)

aaa или bbb знает, что порядок индексов важен независимо от порядка предложений where. Следовательно, используются индексы aaa и bbb в предложении where, и они сортируют ccc на основе сопоставленных aaa и bbb.

GROUP BY x,y ⇒ INDEX(x,y) (no WHERE)

(без WHERE) означает не использовать предложение WHERE?
Что если я использую это так?

WHERE x > 1 GROUP BY x, y

мои мысли:

(1) from table  
(2) where x > 1 -> using index  
(3) group by x, y -> using index..? because (2) already sorted..? or sort again?  
(4) having -> if i did not enter this keyword, is it not used?  
(5) select -> print data(?)  
(6) order by -> group by already order by(?)  

Ответы [ 2 ]

0 голосов
/ 19 мая 2019
GROUP BY x,y ⇒ INDEX(x,y) (no WHERE)

должен, вероятно, сказать "(если ГДЕ нет)".Если есть WHERE, то этот индекс может быть или не быть полезным.Вы должны (обычно) построить INDEX на основе WHERE, и только если вы пройдете мимо него, рассмотрите GROUP BY.


WHERE x > 1 GROUP BY x, y

OK, который может использовать INDEX(x,y), в этой последовательности.Во-первых, он будет фильтровать, и остальная часть индекса будет оставаться в хорошем порядке для группировки.Точно так же:

WHERE x > 1 ORDER BY x, y
WHERE x > 1 GROUP BY x, y ORDER BY x, y

Сортировка не требуется.

Итак, вот шаги, которые я мог бы предпринять:

1. WHERE x > 1 ... --> INDEX(x) (or any index _starting_ with `x`)
2.         ... GROUP BY x, y  --> INDEX(x,y)
3. recheck that I did not mess up the WHERE.

Это не очень хорошоindex:

WHERE x > 1 AND y = 4  GROUP BY x,y

1. WHERE x > 1 AND y = 4 ...  --> INDEX(y,x) in this order!
2.                   ... GROUP BY x,y  --> can use that index

Однако переход к GROUP BY y,x имеет тот же эффект (игнорируя порядок отображения).


(4), имеющий -> если яне вводили это ключевое слово, не используется ли оно?

HAVING, если оно присутствует, применяется после вещей, для которых INDEXes полезны.Отсутствие HAVING означает, что HAVING.


(6) упорядочить по -> сгруппировать по уже упорядоченному по (?)

Это стало сложным вопросом.До недавнего времени (MySQL 8.0; не знаю, когда или изменилась MariaDB), GROUP BY подразумевал эквивалент ORDER BY.Это было нестандартно и потенциально мешало оптимизации.С 8.0 GROUP BY не подразумевает никакого заказа;Вы должны явно запросить заказ (если вам это нужно).

(Я обновил исходный документ в ответ на это обсуждение.)

0 голосов
/ 16 мая 2019

Алгоритм, шаг 2b (GROUP BY) ¶

WHERE aaa = 123 AND bbb = 1 GROUP BY ccc ⇒ INDEX(bbb, aaa, ccc) or INDEX(aaa, bbb, ccc) (='s first, in any order; then the GROUP BY)

есть таблица, как показано ниже:

aaa | bbb | ccc  
------------------ 
123 | 1 | 30  
------------------
123 | 1 | 48  
------------------  
123 | 2 | 27  
------------------  
125 | 1 | 11  
------------------  
125 | 3 | 29  
------------------  
125 | 3 | 40  
------------------  

ГДЕ aaa = 123 И bbb = 1 Результат предложения такой:

aaa | bbb | ccc  
------------------ 
123 | 1 | 30  
------------------
123 | 1 | 48  

отметьте ccc столбец.
Столбец ccc отсортирован по столбцу bbb .
поэтому предложение GROUP BY можно быстро сгруппировать, поскольку столбцы ccc отсортированы.

** ВНИМАНИЕ **
подумайте о WHERE aaa> = 123 AND bbb = 1 GROUP BY ccc предложение.

aaa | bbb | ccc  
------------------ 
123 | 1 | 30  
------------------
123 | 1 | 48  
------------------  
125 | 1 | 11  
------------------  
Столбец

ccc не сортируется по столбцу bbb .
Столбец ccc имеет смысл только в том случае, если столбцы aaa и bbb имеют одинаковое значение.

GROUP BY x,y ⇒ INDEX(x,y) (no WHERE)

это то же самое.

...