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
не подразумевает никакого заказа;Вы должны явно запросить заказ (если вам это нужно).
(Я обновил исходный документ в ответ на это обсуждение.)