137 votes

Une contrainte UNIQUE crée-t-elle automatiquement un index sur le(s) champ(s) ?

Dois-je définir un index séparé sur le email (à des fins de recherche), ou l'index est-il ajouté "automatiquement" avec la colonne 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 l'a suggéré Corbin, j'ai demandé à ce que l'on mette en place un système de gestion de l'information. 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

En ajoutant un IXD_EMAIL à la table, la même requête apparaît :

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where

157voto

piotrm Points 5420

A clé unique est un cas particulier d'index, agissant comme un index normal avec une vérification supplémentaire de l'unicité. L'utilisation de SHOW INDEXES FROM customer vous pouvez voir que vos clés uniques sont en fait des index de type B-tree.

A indice composite sur (email, user_id) est suffisant, vous n'avez pas besoin d'un index séparé sur l'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 préoccuper tant que vous n'y êtes pas confronté.

Pour tester l'utilisation de l'index, vous devez d'abord remplir votre table avec des données pour que l'optimiseur pense qu'il vaut la peine d'utiliser cet index.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X