Un scan d'index systématique peut être un scan d'index total, un scan d'intervalle, suivant les conditions.
Lorsque les conditions pour faire un scan d'index restreint ne
sont pas la, il est toujours possible d'éviter la
constitution de tables temporaires pour les requêtes
GROUP BY
. S'il y a des conditions
d'intervalle dans la clause WHERE
, cette
méthode ne va lire que les clés qui satisfont les
conditions. Sinon, elle appliquera un scan d'index. Comme
cette méthode lit toutes les clés de chaque intervalle
définit par WHERE
, ou scanne tout l'index
s'il n'y a pas de condition d'intervalles, nous l'appelons un
``scan d'index systématique''. Notez qu'avec un scan d'index
systématique, les opérations de regroupement sont faites
après la lecture des clés qui satisfont les conditions.
Pour que cette méthode fonctionne, il suffit que toutes les
colonnes d'une requête qui fasse référence à une partie de
clé avant ou entre les conditions de la clause GROUP
BY
, soient des conditions constantes. Ces constantes
remplissent les ``trous'' dans les clés de recherche, pour
qu'il soit possible de former des préfixes comlets d'index.
Ensuite, ces préfixes seront utilisés pour les recherches.
Si vous avez besoin de tri avec GROUP BY
,
et qu'il est possible de former des clés de recherche avec
des préfixes d'index, MySQL pourra aussi éviter le tri, car
la recherche avec préfixe dans un index ordonnés lit les
clés dans l'ordre.
Les requêtes suivantes ne fonctionneront pas avec la
première méthode, mais fonctionneront toujours avec la
deuxième méthode d'accès aux index (en supposant que nous
avons l'index idx
sur la table table
t1
) :
Il y a un ``trou'' dans le GROUP BY
,
mais il est couvert par la condition (c2 = 'a').
SELECT c1, c2, c3 FROM t1 WHERE c2 = 'a' GROUP BY c1, c3;
GROUP BY
ne commence pas par la
première clé, mais il y a une condition qui fournit une
constante pour cette partie de clé :
SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3;
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.