代码之家  ›  专栏  ›  技术社区  ›  Joel

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

  •  1
  • Joel  · 技术社区  · 14 年前

    如果表被定义为对列具有唯一约束,那么如果我们希望对该列进行索引以进行快速查找,是否还需要在该列上定义单独的索引?

    例如,给定以下表索引:

    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 回复  |  直到 14 年前
        1
  •  3
  •   Quassnoi    14 年前

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

    但是,您的唯一约束包含两列 (host_id, hash_pathqry) ,和 hash_pathqry

    索引维护列的字典顺序,因此 散列路径 host_id .

    因此,您已经拥有的唯一索引不会改进查找 HASH_PATHQRY I_FRONTIER_HASH_PATHQRY 仍然是必需的。

        2
  •  0
  •   Jon Black    14 年前

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