Le plus efficace est lorsque l'index sert à lire directement
un groupe de champs. Avec cette méthode d'accès, MySQL
exploite la propriété de certains types d'index comme les
B-Tree, pour lesquels les clés sont triées. Cette
propriété permet la recherche de groupsa dans un index en
omettant d'autres clés pour satisfait toutes les conditions
de la clause WHERE
. Comme cette méthode
d'accès ne prend en compte qu'une fraction de toutes les
clés d'un index, elle est appelée ``scan restreint
d'index'', ou loose index scan
. Lorsque
qu'il n'y a pas de clause WHERE
, un scan
restreint va lire autant de clé que de groupe, ce qui peut
être un nombre inférieur au nombre de clés. Si la clause
WHERE
contient des prédicats d'intervalles
(indiqués dans Section 7.2.1, « Syntaxe de EXPLAIN
(Obtenir des informations sur les
SELECT
) », dans la colonne
range
), un scan restreint d'index analysera
la première clé de chaque groupe qui satisfont les
conditions d'intervalle, et lira ainsi le minimum possible de
clé. Cela est rendu possible dans les conditions suivantes :
La requête utilise une seule table.
La clause GROUP BY
inclut les
premières parties consécutives de l'index, et si la
requête utilise une clause DISTINCT
à
la place d'une clause GROUP BY
, tous
les attributs distincts se rapportent au début de
l'index.
Les seules fonctions d'aggrégation utilisées sont
MIN()
et MAX()
, et
toutes font référence à la même colonne.
Toute les autres parties de l'index de GROUP
BY
doivent être des constantes (c'est à dire
qu'elles doivent être référencées avec des
constantes), hormis pour les arguments des fonctions
MIN()
et MAX()
.
Le résultat de EXPLAIN
pour ces requêtes
affiche la valeur Using index for group-by
dans la colonne Extra
.
Les requêtes suiavntes sont autant d'exemple qui sont
éligibles, en supposant qu'il existe un index
idx(c1, c2, c3)
sur la table
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;
Les requêtes suivantes ne peuvent pas être exécutées avec les méthodes de sélection rapide, pour les raisons citées :
Il y a d'autres fonctions d'agrégation que
MIN()
ou MAX()
:
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;
Les champs de GROUP BY
ne font pas
référence au début de l'index :
SELECT c1,c2 FROM t1 GROUP BY c2, c3;
La requête fait référence à une partie de clé qui est
placée après la partie GROUP BY
, et
pour lesquelles l'égalité ne se fait pas avec une
constante :
SELECT c1,c3 FROM t1 GROUP BY c1, c2;
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.