MySql - 如果列的索引被定义为唯一,那么该列的索引是多余的吗?

时间:2010-11-03 12:18:02

标签: sql mysql indexing

如果某个表被定义为对列具有唯一约束,是否还需要为该列定义单独的索引以进行快速查找?

例如,给定以下表索引:

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

在给定唯一约束'uniq_constr'的情况下,索引'I_FRONTIER_HASH_PATHQRY'是多余的吗?

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

2 个答案:

答案 0 :(得分:3)

唯一索引也是普通索引,不需要创建单独的非索引索引。

但是,您的唯一约束包含两列(host_id, hash_pathqry)hash_pathqry正在落后。

索引维护列的词典顺序,因此hash_pathqry仅在host_id的每个值中排序。

因此,您已拥有的唯一索引不会改善HASH_PATHQRY上的查找。 <{1}}仍然是必需的。

答案 1 :(得分:0)

否 - 如果指定unique,用户名varbinary(32)unique not null,则MySQL会自动添加唯一索引。