sql - MySql - 如果列上的索引被定义为唯一,它是否是多余的?

标签 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 列)

最佳答案

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

但是,您的唯一约束涵盖两列(host_id, hash_pathqry)hash_pathqry 位于尾随。

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

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

关于sql - MySql - 如果列上的索引被定义为唯一,它是否是多余的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4086946/

相关文章:

python - 在 python 中跟踪索引的正确方法是什么?

mysql - 在 MySQL 查询中将时间戳转换为日期

sql - 如何使用函数在 postgresql 上用数据间隔填充表

php - 您在 mySQL 或 SESSIONS 之间选择什么来继续我的页面?

java - Lucene 中多值字段的性能问题

search - 使用 Solr 的 log4j 日志索引

mysql - 检查最近 n 天的行是否存在

mysql - 如何组合两个不相关的 SQL 查询

mysql - 加快大表的查询速度

php - 在 PHP 中将数据插入数据库