Optimisation des commandes SELECT et autres requêtes
<<<
Scan restreint d'index Scan d'index systématique
>>>

7.2.11 Comment MySQL optimise les clauses GROUP BY
7.2 Optimisation des commandes SELECT et autres requêtes
7 Optimisation de MySQL
 Manuel de Référence MySQL 4.1 : Version Française

->Scan restreint d'index
Scan d'index systématique

7.2.11.1 Scan restreint d'index

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 Syntaxe de EXPLAIN (Obtenir des informations 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;
    

<< Scan restreint d'index >>
Optimisation des commandes SELECT et autres requêtes Comment MySQL optimise les clauses GROUP BY Scan d'index systématique