Dois-je définir un index séparé sur la email
colonne (à des fins de recherche), ou est-ce que l'index est ajouté "automatiquement" avec la 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;
EDIT : comme suggéré par Corbin, j'ai demandé EXPLAIN SELECT * FROM customer WHERE email = 'address'
sur une table vide. Voici 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
Réponses:
Une clé unique est un cas particulier d'index, agissant comme un index normal avec une 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é uniquement sur les e-mails - 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 préoccuper tant que vous ne les rencontrez pas.En ce qui concerne le test de l'utilisation de l'index, vous devez d'abord remplir votre table avec des données pour que l'optimiseur pense qu'il vaut vraiment la peine d'utiliser cet index.
la source
EXPLAIN
test montre des valeurs fausses à cause de la table vide?user_id
abord, puisemail
elle n'apparaît pas dansEXPLAIN
. Etes-vous conscient de cela?