2010-11-03 14 views
1

Si une table est définie pour avoir une contrainte unique sur une colonne, il est également nécessaire de définir un indice distinct sur cette colonne si l'on veut qu'il soit indexé pour la recherche rapide?MySql - Un index sur une colonne est-il redondant s'il est défini comme unique?

Par exemple, étant donné les indices tableau suivant:

mysql> show index from FRONTIER; 
+----------+------------+-------------------------+--------------+--------------+-----------+-------------+----------+--------+------+-------------+---------+ 
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+----------+------------+-------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+ 
| FRONTIER |   0 | PRIMARY     |   1 | ID   | A   |   0 |  NULL | NULL |  | BTREE  |   | 
| FRONTIER |   0 | uniq_cnstr    |   1 | HOST_ID  | A   |   0 |  NULL | NULL |  | BTREE  |   | 
| FRONTIER |   0 | uniq_cnstr    |   2 | HASH_PATHQRY | A   |   0 |  NULL | NULL |  | BTREE  |   | 
| FRONTIER |   1 | I_FRONTIER_HASH_PATHQRY |   1 | HASH_PATHQRY | A   |   0 |  NULL | NULL |  | BTREE  |   | 
+----------+------------+-------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+ 

est l'indice 'I_FRONTIER_HASH_PATHQRY' contrainte unique donnée redondante 'uniq_constr'?

(notez que la contrainte unique couvre 2 colonnes)

Répondre

3

Un index unique est un indice clair aussi bien, il n'y a pas besoin de créer un séparé un non unique.

Toutefois, votre contrainte unique couvre deux colonnes (host_id, hash_pathqry), le hash_pathqry étant à la traîne.

Un index conserve l'ordre lexicographique des colonnes, donc hash_pathqry sont uniquement classés dans chaque valeur unique de host_id.

Ainsi, l'index unique que vous avez déjà ne va pas améliorer les recherches sur HASH_PATHQRY. Le I_FRONTIER_HASH_PATHQRY est toujours requis.

+0

Même si l'index unique enjambe deux colonnes? – Joel

+1

@Joel: si la colonne était en tête, vous n'auriez pas besoin de créer un index séparé. Mais il traîne donc vous devez toujours le faire. – Quassnoi

+0

Merci, donc si je comprends bien, si l'ordre de deux colonnes de la contrainte unique ont été inversés alors aucun indice supplémentaire serait nécessaire sur la colonne « » leader « I_FRONTIER_HASH_PATHQRY »? – Joel

0

pas - si vous spécifiez le nom d'utilisateur unique, i.e. varbinary (32) unique non NULL, MySQL ajoute un index unique automatiquement.

+0

apparemment pas, voir le commentaire de Quassnoi re: contraintes uniques couvrant plusieurs colonnes. – Joel

+0

@Joel: dans le cas de plusieurs colonnes, un unique index unique composite sur ces colonnes sera créé. MySQL gère toujours les contraintes uniques avec des indices uniques, donc la déclaration de @ f00 est correcte (bien que ce ne soit pas une réponse à votre question). – Quassnoi

+0

@all - mon mauvais, "défini pour avoir un index unique sur une colonne" est littéralement une colonne –