Optimisation des commandes SELECT et autres requêtes
<<<
Méthode d'accès par intervalle pour les index multi-colonnes Méthode d'accès par intervalle pour les index multi-colonnes
>>>

7.2.5 Optimisation d'intervalle
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

->Méthode d'accès par intervalle pour les index multi-colonnes
Méthode d'accès par intervalle pour les index multi-colonnes

7.2.5.1 Méthode d'accès par intervalle pour les index multi-colonnes

Pour un index à une colonne, les intervalles peuvent être représentés en pratique par les conditions correspondantes à la clause WHERE , et cela donne des ``conditions d'intervalle'' au lieu d'intervalle.

La définition d'une condition d'intervalle pour un index mono-colonne est la suivante :
  • Pour les index BTREE et HASH , la comparaison d'une partie de clé avec une valeur constante est une condition d'intervalle lorsqu'on l'utilise avec = , <=> , IN , IS NULL ou IS NOT NULL .
  • Pour les index BTREE , la comparaison d'une partie de clé avec une constante est une condition d'intervalle avec les opérateurs > , < , >= , <= , BETWEEN , != et <> , ou 'LIKE 'pattern'' (où ''pattern'' ne commence pas avec un joker).
  • Pour tous les types d'index, plusieurs conditions d'intervalles combinées avec des opérateurs OR ou AND forment une condition d'intervalle.

``Valeur constante'', dans les descriptions précédentes, signifie l'un des objets suivants :

  • Une constante dans une chaîne de requête
  • Une colonne dans une table const ou system dans une jointure.
  • Le résultat d'une sous-requête non-correllée
  • Une expression composée entièrement de sous-expression de l'un des types précédents.

Voici des exemples de requêtes avec des conditions d'intervalles dans la clause WHERE :


SELECT * FROM t1 WHERE key_col > 1 AND key_col < 10;

SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20);

SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN
'bar' AND 'foo';
Notez que certaines valeurs non-constantes sont converties en constantes durant la phase de propagation des constantes.

MySQL essaie d'extraire les conditions d'intervalle de la clause WHERE pour chaque index possible. Durant le processus d'extraction, les conditions qui ne peuvent pas être utilisées sont ignorées, les conditions qui produisent des intervalles qui se recoupent sont combinées ensembles, et les conditions qui produisent des intervalles vides sont supprimées.

Par exemple, observez la commande suivante, où key1 est une colonne indexée et nonkey n'est pas indexée :

SELECT * FROM t1 WHERE
   (key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR
   (key1 < 'bar' AND nonkey = 4) OR
   (key1 < 'uux' AND key1 > 'z');
Le processus d'extraction de la clé key1 est la suivante :
  • Début avec la clause WHERE originale :
    
    (key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR
    (key1 < 'bar' AND nonkey = 4) OR
    (key1 < 'uux' AND key1 > 'z')
  • Suppression de nonkey = 4 et key1 LIKE '%b' car elles ne peuvent pas êtr utilisées pour des conditions d'intervalle. La bonne méthode pour les supprimer est de les remplacer avec une valeur TRUE , pour qu'elles n'ignorent aucune lignes lors de la recherche. Cela donne :
    
    (key1 < 'abc' AND (key1 LIKE 'abcde%' OR TRUE)) OR
    (key1 < 'bar' AND TRUE) OR
    (key1 < 'uux' AND key1 > 'z')
  • Supression des conditions qui sont toujours vraies ou fausses :
    • (key1 LIKE 'abcde%' OR TRUE) est toujours vraie
    • (key1 < 'uux' AND key1 > 'z') est toujours fausse
    Remplacement de ces conditions avec des constantes, nous obtenons :
    
    (key1 < 'abc' AND TRUE) OR (key1 < 'bar' AND TRUE) OR (FALSE)
    
    Suppression des constantes TRUE et FALSE inutiles, nous obtenons :
    
    (key1 < 'abc') OR (key1 < 'bar')
    
  • Combinaisons des intervalles communs conduit à une seule condition finale, à utiliser pour l'intervalle :
    
    (key1 < 'bar')
    
En général (et tel que démontré dans notre exemple), les conditions utilisées pour une condition d'intervalle sont moins restrictives que la clause WHERE . MySQL va compléter la recherche par des filtres appliqués aux lignes trouvées pour supprimer celles qui ne satisfont par les clauses WHERE .

L'algorithme d'extraction d'intervalle peut gérer des conditions AND / OR de profondeur arbitraire, et son résultat ne dépend pas de l'ordre des conditions dans la clause WHERE .

<< Méthode d'accès par intervalle pour les index multi-colonnes >>
Optimisation des commandes SELECT et autres requêtes Optimisation d'intervalle Méthode d'accès par intervalle pour les index multi-colonnes