2012-10-30 5 views
2

Si j'ai un index unique sur une table qui couvre 2 champs, devrais-je ajouter un autre index sur chaque champ?Dois-je ajouter plusieurs index?

Exemple:

Ma table ressemble à ceci:

CREATE TABLE IF NOT EXISTS `my_table` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `usersID` int(11) NOT NULL, 
    `userTypesID` int(11) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

ajouter alors un index unique qui couvre à la fois usersID et userTypesID:

ALTER TABLE `my_table` ADD UNIQUE `usersID_userTypesID` ( `usersID` , `userTypesID`) 

Est-il vaut la peine d'ajouter 2 mois re indexes, un sur usersID et un autre sur userTypesID? par exemple:

ALTER TABLE `my_table` ADD INDEX ( `usersID`) 
ALTER TABLE `my_table` ADD INDEX ( `userTypesID`) 

ajouter uniquement ces indices supplémentaires accélèrent certaines requêtes? Tels que:

SELECT  `usersID` 
FROM  `my_table` 
WHERE  `userTypesID` = 101 

Ou

SELECT  `usersTypesID` 
FROM  `my_table` 
WHERE  `usersID` = 29 

Répondre

2

In theory l'index sur (usersID, userTypesID) agira également comme un indice par lui-même sur usersID, car il est la plus colonne de gauche.

Vous bénéficieriez également d'un index sur userTypesID.

1

Vous n'avez pas besoin d'index supplémentaires, see here. Essayez aussi SHOW INDEXES FROM my_table

+0

+1, Merci pour la question de référence, il confirme que la réponse d'Alnitaks est correcte, car comme indiqué dans la réponse, mysql peut utiliser l'index le plus à gauche. – Drahcir

+0

@ Gerve le lien dans ma réponse (peut-être pas très évident) parle également d'utiliser la colonne la plus à gauche. J'ai dit «en théorie» dans ma réponse parce que j'ai vu des circonstances où un index sur une seule colonne fonctionnait beaucoup mieux qu'un index sur deux. – Alnitak

+0

Je suggérerais d'essayer EXPLAIN SELECT .. O users usersID = 1 EXPLAIN SELECT .. WHERE userTypesID = 1 et vice versa, vous verrez quand l'index est utilisé et quand non. Et oui, le lien d'Alnitak explique comment cela fonctionne. – olegkhuss

Questions connexes