web-dev-qa-db-fra.com

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

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
84
gremo

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.

95
piotrm