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
'
(où
pattern
''
ne
commence pas avec un joker).
pattern
'
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 WHEREkey_col
> 1 ANDkey_col
< 10; SELECT * FROM t1 WHEREkey_col
= 1 ORkey_col
IN (15,18,20); SELECT * FROM t1 WHEREkey_col
LIKE 'ab%' ORkey_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
.
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.