[+/-]
La méthode de combinaison d'index (Index
Merge
, index_merge
) est utilisée
pour lire des lignes avec plusieurs scans
ref
, ref_or_null
et
range
et les combiner en un seul résultat.
Cette méthode est employée lorsque les conditions sur la table
sont un groupe de conditions disjointes pour lesquelles
ref
, ref_or_null
, ou
range
peuvent être utilisées avec
différentes clés.
Ce type d'optimisation ``join'' est nouveau en MySQL 5.0.0, et représente un changement significatif dans le comportement de MySQL avec les index, car l'ancienne règle était que le serveur n'utilisait qu'un seul index au plus pour chaque table référencée.
Dans le résultat de EXPLAIN
, cette méthode
apparait sous le nom de index_merge
dans la
colonne de type type
. Dans ce cas, la colonne
key
contient la liste des index utilisés, et
key_len
contient la liste des tailles
maximales de clé pour chaque index.
Exemples :
SELECT * FROMtbl_name
WHEREkey_part1
= 10 ORkey_part2
= 20; SELECT * FROMtbl_name
WHERE (key_part1
= 10 ORkey_part2
= 20) ANDnon_key_part
=30; SELECT * FROM t1, t2 WHERE (t1.key1
IN (1,2) OR t1.key2
LIKE 'value
%') AND t2.key1
=t1.some_col
; SELECT * FROM t1, t2 WHERE t1.key1
=1 AND (t2.key1
=t1.some_col
OR t2.key2
=t1.some_col2
);
La méthode de combinaison d'index a différentes méthodes
d'accès aux index, tels que présentées dans le champ
Extra
du résultat de la commande
EXPLAIN
:
intersection
union
sort-union
Les sections suivantes décrivent ces méthodes avec plus de détails :
Note : L'algorithme d'optimisation des combinaisons d'index a les limitations suivantes :
Si un scan d'intervalle est possible avec une clé, la combinaison d'index sera omise. Par exemple :
SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
Pour cette requête, deux solutions sont possibles :
Une combinaison d'index avec la condition
(goodkey1 < 10 OR goodkey2 <
20)
.
Un scan d'intervalle avec la condition badkey
< 30
.
Mais ici, l'optimisateur ne considèrera que la seconde
méthode. Si ce n'est pas ce que vous souhaitez, vous pouvez
forcer l'optimiseur à utiliser
index_merge
en utilisant les clauses
IGNORE INDEX
et FORCE
INDEX
. Les requêtes suivantes seront exécutées
avec une combinaison d'index :
SELECT * FROM t1 FORCE INDEX(goodkey1,goodkey2) WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30; SELECT * FROM t1 IGNORE INDEX(badkey) WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
Si votre requête a une clause WHERE
complexe avec des conditions
AND
/OR
imbriquées, et
que MySQL n'a pas identifié la méthode optimale, essayez
de répartir les conditions en utilisant les lois
d'identitée :
(x
ANDy
) ORz
= (x
ORz
) AND (y
ORz
) (x
ORy
) ANDz
= (x
ANDz
) OR (y
ANDz
)
Le choix entre les méthodes de index_merge
est basée sur le calcul de coûts.
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.