| 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
  :
 Notez que certaines valeurs non-constantes sont converties en constantes
durant la phase de propagation des constantes.| 
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';
 | 
 
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 : Le processus d'extraction de la clé  
key1
  est la suivante :| 
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');
 | 
 
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
 .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 :  
Remplacement de ces conditions avec des constantes, nous obtenons :
(key1 LIKE 'abcde%' OR TRUE)
   est toujours vraie
(key1 < 'uux' AND key1 > 'z')
  est toujours fausse
 Suppression des constantes  
TRUE
  et  
FALSE
  inutiles, nous obtenons :| 
(key1 < 'abc' AND TRUE) OR (key1 < 'bar' AND TRUE) OR (FALSE)
 | 
 | 
(key1 < 'abc') OR (key1 < 'bar')
 | 
Combinaisons des intervalles communs conduit à une seule condition finale,
à utiliser pour l'intervalle : 
 
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
 .
 |