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

classement performant des clés dans un index composé MySQL (WRT Rails Polymorphic associations et STI)

De mes propres recherches (mais je ne suis pas un expert DBA), j'ai appris qu'il y a deux choses à considérer lors du choix de l'ordre d'un index de clé composé.

Tout d'abord, concernant la cardinalité des colonnes, les index sont généralement meilleurs pour rechercher des colonnes avec une cardinalité élevée. Je serais donc enclin à placer la colonne avec la cardinalité la plus élevée en premier dans l'index. Pour référence, il existe un article intitulé MySQL Query Optimization qui dit :

Dans votre cas, le _id les colonnes correspondent clairement mieux à cette définition, elles sont donc un meilleur candidat pour être un préfixe de la clé.

Une autre chose à considérer serait la réutilisabilité de ces index. La plupart (sinon la totalité) des systèmes de bases de données autorisent la réutilisation d'un préfixe d'une clé composée. Par exemple, une clé composée sur (owner_id, owner_type) peut également être utilisé par des requêtes sur owner_id mais pas sur owner_type .

Donc, d'après ce que vous avez expliqué dans votre question, il serait peut-être préférable d'utiliser deux index :un index de clé composé sur (owner_id, owner_type) et un autre sur (owner_type) .

Enfin, tout dépend de votre ensemble de données et de vos requêtes. Essayez plusieurs scénarios, des références en utilisant différents ordres de clés composées pour voir quelle est la solution la plus optimale. N'oubliez pas non plus que les index entraînent une pénalité en écriture sur vos tables.

Mettre à jour :Il y a aussi une autre question SO plutôt populaire sur l'index de clé composé ici :

Quand dois-je utiliser un index composite ?