web-dev-qa-db-fra.com

MySQL peut-il utiliser plusieurs index pour une seule requête?

Imaginez un tableau avec plusieurs colonnes, disons, id, a, b, c, d, e. Je sélectionne généralement par id, cependant, il existe plusieurs requêtes dans l'application cliente qui utilisent diverses conditions sur des sous-ensembles de colonnes.

Lorsque MySQL exécute une requête sur une seule table avec plusieurs conditions WHERE sur plusieurs colonnes, peut-il vraiment utiliser des index créés sur différentes colonnes? Ou la seule façon d'accélérer est de créer des index multi-colonnes pour toutes les requêtes possibles?

44
kolypto

Oui, MySQL peut utiliser plusieurs index pour une seule requête. L'optimiseur déterminera quels index bénéficieront à la requête. Vous pouvez utiliser EXPLAIN pour obtenir des informations sur la façon dont MySQL exécute une instruction. Vous pouvez ajouter ou ignorer des index à l'aide d'indications comme ceci:

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;

Je suggère de lire comment MySQL utilise les index .

Quelques extraits:

S'il y a un choix entre plusieurs index, MySQL utilise normalement l'index qui trouve le plus petit nombre de lignes.

S'il existe un index à plusieurs colonnes sur col1 et col2, les lignes appropriées peuvent être récupérées directement. S'il existe des index séparés sur une seule colonne sur col1 et col2, l'optimiseur tentera d'utiliser l'optimisation de fusion d'index (voir Section 8.3.1.4, "Optimisation de fusion d'index"), ou tentera de trouver l'index le plus restrictif en décidant quel index trouve le moins lignes et en utilisant cet index pour récupérer les lignes.

57
Kermit

Classiquement, MySQL peut utiliser un index par référence de table dans une requête donnée. Cependant, dans les versions plus récentes de MySQL, une opération appelée index merge peut avoir lieu et permettre à MySQL d'utiliser plus d'un index par table.

http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes

19
Chris Henry