Mysql
 sql >> Base de données >  >> RDS >> Mysql

Couverture Mysql vs composite vs index de colonne

Un indice de couverture n'est pas la même chose qu'un indice composite.

Si j'ai 2 index séparés un sur col3 et l'autre sur col4, lequel d'entre eux sera utilisé dans cette requête ?

L'index avec la cardinalité la plus élevée.
MySQL conserve des statistiques sur quel index a quelles propriétés.
L'index qui a le pouvoir le plus discriminant (comme en témoignent les statistiques de MySQL) sera utilisé.

J'ai lu quelque part que pour chaque table de la requête, un seul index est utilisé. Cela signifie-t-il qu'il n'y a aucun moyen pour la requête d'utiliser les deux index ?

Vous pouvez utiliser une sous-sélection.
Ou encore mieux, utilisez un index composé qui inclut à la fois col3 et col4.

Deuxièmement, si je créais un index composite en utilisant à la fois col3 et col4 mais que je n'utilisais que col3 dans la clause WHERE, cela serait-il pire pour les performances? exemple :

Indice composé
Le terme correct est compound index, pas composite.
Seul le le plus à gauche une partie de l'index composé sera utilisée.
Donc, si l'index est défini comme

index myindex (col3, col4)  <<-- will work with your example.
index myindex (col4, col3)  <<-- will not work. 

Voir :http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html

Notez que si vous sélectionnez un champ le plus à gauche, vous pouvez vous en tirer sans utiliser cette partie de l'index dans votre clause where.
Imaginez que nous ayons un index composé

Myindex(col1,col2)

SELECT col1 FROM table1 WHERE col2 = 200  <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200     <<-- will NOT use index.  

La raison pour laquelle cela fonctionne est que la première requête utilise l'index de couverture et effectue une analyse sur celui-ci.
La deuxième requête doit accéder à la table et pour cette raison, l'analyse de l'index n'a pas de sens.
Cela ne fonctionne que dans InnoDB.

Qu'est-ce qu'un index de couverture
Un index de couverture fait référence au cas où tous les champs sélectionnés dans une requête sont covered par un index, dans ce cas InnoDB (pas MyISAM) ne lira jamais les données de la table, mais n'utilisera que les données de l'index, accélérant considérablement la sélection.
Notez que dans InnoDB, la clé primaire est incluse dans tous les index secondaires, donc d'une certaine manière tous les index secondaires sont des index composés.
Cela signifie que si vous exécutez la requête suivante sur InnoDB :

SELECT indexed_field FROM table1 WHERE pk = something

MySQL utilisera toujours un index couvrant et n'accédera pas à la table réelle. Bien qu'il puisse utiliser un index couvrant, il préférera la PRIMARY KEY car il n'a besoin de toucher qu'une seule ligne.