Optimisation d'intervalle
<<<
Optimisation de combinaison d'index Comment MySQL optimise IS NULL
>>>

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

Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT )
Mesurer les performances d'une requête
Vitesse des requêtes SELECT
Comment MySQL optimise les clauses WHERE
Optimisation d'intervalle
->Optimisation de combinaison d'index
Comment MySQL optimise IS NULL
Comment MySQL optimise DISTINCT
Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN
Comment MySQL optimise ORDER BY
Comment MySQL optimise les clauses GROUP BY
Comment MySQL optimise LIMIT
Comment éviter les analyses de tables
Vitesse des requêtes INSERT
Vitesses des commandes UPDATE
Rapidité des requêtes DELETE
Autres conseils d'optimisation

7.2.6 Optimisation de combinaison d'index

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 * FROM tbl_name WHERE key_part1 = 10 OR key_part2 = 20;

SELECT * FROM tbl_name
    WHERE (key_part1 = 10 OR key_part2 = 20) AND non_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 AND y) OR z = (x OR z) AND (y OR z)
    (x OR y) AND z = (x AND z) OR (y AND z)

Le choix entre les méthodes de index_merge est basée sur le calcul de coûts.

Sommaire :

<< Optimisation de combinaison d'index >>
Optimisation d'intervalle Optimisation des commandes SELECT et autres requêtes Comment MySQL optimise IS NULL