:: DEVELOPER ZONE
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_nameWHEREkey_part1= 10 ORkey_part2= 20; SELECT * FROMtbl_nameWHERE (key_part1= 10 ORkey_part2= 20) ANDnon_key_part=30; SELECT * FROM t1, t2 WHERE (t1.key1IN (1,2) OR t1.key2LIKE 'value%') AND t2.key1=t1.some_col; SELECT * FROM t1, t2 WHERE t1.key1=1 AND (t2.key1=t1.some_colOR 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 :
(xANDy) ORz= (xORz) AND (yORz) (xORy) ANDz= (xANDz) OR (yANDz)
Le choix entre les méthodes de index_merge est basée sur
le calcul de coûts.
© 1995-2005 MySQL AB. All rights reserved.
