关于数据库索引的一个问题:有复合索引建立于列 a,b,c。那么 where a=1 and b like b% and c=3 命中此索引吗? where a=1 and b > 2 and c=3 命中此索引吗?

86 天前
 BraveXaiver
主要是 C 列还是否能使用此索引?
谢谢。
1533 次点击
所在节点    数据库
7 条回复
sagaxu
86 天前
都能利用(a,b,c)中的前缀(a,b),如果(a,b)值分布很稀疏,是可以命中索引的,如果(a,b)很稠密,可能会走全表扫描,或者使用 c 索引(如果 C 是稀疏的,且建立了 c 索引或者(c,...)复合索引)。
Rickkkkkkk
86 天前
两个例子都只能命中 a,b ,命中不了 c
summerwar
86 天前
建议把索引建立为 a c b 的联合索引,至于有没有命中索引,你直接 EXPLAIN 分析下就能看到。

sql 不熟,但是大体的意思是 and 会被优化成并列的,所以实际的搜索语句是 a=1 c=3 b like b%,所以为了能够用上所有索引字段,建议你把 c 放到 b 前面
BraveXaiver
86 天前
@Rickkkkkkk 我也是这么想的 但在一篇文章里看到前者可以后者不可以 所以才提这个帖子
kg2019
86 天前
索引下推,Explain 看一下是不是 Using index condition
chanchan
85 天前
一般匹配到索引返回多维数据为止
bbsingao
85 天前
查询 1:WHERE a=1 AND b LIKE 'b%' AND c=3

完全命中复合索引 (a, b, c),因为所有条件 (= 和前缀 LIKE) 按索引列顺序使用,且操作类型索引友好。

查询 2:WHERE a=1 AND b > 2 AND c=3

部分命中复合索引 (a, b, c),通常只利用到 (a, b) 部分,因为 b > 2 是范围查询,可能中断索引后续列 (c) 的使用。

话说现在这种问题都没必要论坛提问了,AI 都是最顶级的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1137452

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX