2010-11-03 64 views
1

如果一個表被定義爲對列具有唯一約束,那麼如果我們希望將其索引爲快速查找的索引,是否還需要在該列上定義單獨的索引?MySql - 如果一列中的索引被定義爲唯一的,它是否是冗餘索引?

例如,如下表索引:

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  |   | 
+----------+------------+-------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+ 

是索引 'I_FRONTIER_HASH_PATHQRY' 多餘,唯一約束 'uniq_constr'?

(注意,唯一約束跨越2列)

回答

3

唯一索引是一個普通的索引,以及,沒有必要創建一個單獨的非唯一一個。

但是,您的唯一約束包含兩列(host_id, hash_pathqry)hash_pathqry正在尾隨。

索引維護列的字典順序,所以hash_pathqry僅在每個單個值host_id內排序。

因此,您已有的唯一索引不會改進HASH_PATHQRY上的查找。 I_FRONTIER_HASH_PATHQRY仍然是必需的。

+0

即使唯一索引跨越兩列嗎? – Joel 2010-11-03 12:21:23

+1

@Joel:如果該列是領先的,則不必創建單獨的索引。但是,它仍在拖尾,所以你仍然必須這樣做。 – Quassnoi 2010-11-03 12:22:31

+0

謝謝,所以如果我理解正確,如果在唯一約束中的兩列的順序是顛倒的,那麼在'前導'列'I_FRONTIER_HASH_PATHQRY'上不需要額外的索引? – Joel 2010-11-03 12:24:26

0

否 - 如果您指定了唯一名稱即varbinary(32)unique not null,那麼MySQL會自動添加一個唯一索引。

+0

顯然不是,請參閱Quassnoi的評論re:跨越多列的唯一約束。 – Joel 2010-11-03 12:25:38

+0

@Joel:在多列的情況下,將創建這些列上的單個複合唯一索引。 'MySQL'總是用獨特的索引來監視唯一約束,所以@f00的聲明是正確的(儘管這不是對你的問題的回答)。 – Quassnoi 2010-11-03 12:29:31

+0

@all - 我的不好,「定義爲在列上有一個唯一索引」實際上是一列 – 2010-11-03 12:59:11