Dois-je définir un index séparé dans la colonne email
(à des fins de recherche), ou si l'index est "automatiquement" ajouté avec UNIQ_EMAIL_USER
contrainte?
CREATE TABLE IF NOT EXISTS `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`first` varchar(255) NOT NULL,
`last` varchar(255) NOT NULL,
`slug` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_SLUG` (`slug`),
UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;
MODIFIER : comme suggéré par Corbin j'ai demandé pour EXPLAIN SELECT * FROM customer WHERE email = 'address'
sur une table vide. Voilà le résultat, je ne sais pas comment l'interpréter:
id select_type type possible_keys key key_len ref rows Extra
1 SIMPLE ALL NULL NULL NULL NULL 1 Using where
Lors de l'ajout d'un IXD_EMAIL à la table, la même requête montre:
id select_type type possible_keys key key_len ref rows Extra
1 SIMPLE ref IDX_EMAIL IDX_EMAIL 257 const 1 Using where
Une clé unique est un cas particulier d'index, agissant comme un index normal avec vérification supplémentaire de l'unicité. En utilisant SHOW INDEXES FROM customer
vous pouvez voir que vos clés uniques sont en fait des index de type B-tree.
Un index composite sur (email, user_id) suffit, vous n'avez pas besoin d'un index séparé sur email uniquement - mysql peut utiliser les parties les plus à gauche d'un index composite. Il peut y avoir des cas limites où la taille d'un index peut ralentir vos requêtes, mais vous ne devriez pas vous en soucier tant que vous ne les rencontrez pas réellement.
En ce qui concerne le test de l'utilisation de l'index, vous devez d'abord remplir votre tableau avec des données pour que l'optimiseur pense qu'il vaut vraiment la peine d'utiliser cet index.