2010-11-03 48 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