含唯一值列的索引选型疑问:唯一与非唯一索引搜索逻辑探讨
关于唯一/非唯一索引在等值查询中的行为拆解
嘿,咱们先把你的误解和问题拆解开来说清楚:
首先纠正两个关键误区:
- 唯一索引不是从表开头搜索到目标值就停止——它是基于B-tree(大部分数据库默认的索引结构)的快速定位,通过二分查找直接找到目标键的位置,根本不会从头扫表;
- 非唯一索引在等值查询(比如你的
where name = 'Jeane Lamm')场景下,也不会去“搜索WHERE语句的临近范围”,那是范围查询(比如name LIKE 'J%')才会有的逻辑。
针对你的具体场景:
你的列全是唯一值,哪怕建的是非唯一索引,执行where name = 'Jeane Lamm'时,数据库的操作逻辑是这样的:
- 利用索引的有序性(字符串索引会按字典序排序),通过B-tree的分层查找,直接定位到
Jeane Lamm这个字符串对应的索引节点; - 因为你的列没有重复值,所以找到这个索引条目后,就能直接关联到对应的行数据返回,既不会扫描所有J开头的名称,更不会触发全表扫描。
额外补充:
唯一索引和非唯一索引的核心差异只在于是否允许键值重复,在等值查询的执行效率上,当列没有重复值时,两者几乎没有区别——唯一索引只是多了一层“确保键值唯一”的约束,查找逻辑和非唯一索引是一致的。只有当你执行范围查询(比如找所有J开头的名字)时,才会扫描索引中对应的范围区间,但那也远快于全表扫描。
内容的提问来源于stack exchange,提问作者areviews app
相关产品推荐
相关产品推荐

