mysql复合索引中,使用like'xxx%'为什么不会使后续索引失效

最近在看索引优化相关的内容,有个知识点让我很疑惑。

举个例子:

create index index_c1c2c3 on table1(c1,c2,c3)

在表table1的c1,c2,c3三个字段创建复合索引,这个时候执行两条sql语句

1、select * from table1 where c1=a and c2>b and c3=c;

对该语句来说,因为c2列用了范围查询,导致复合索引只用了c1、c2两个字段,c3没用到。基于B+树的数据结构的话我觉得是没有问题。

2、select * from table1 where c1=a and c2 like 'c%' and c3=c;

对该语句来说,反而是三个索引都用到了,但是like的效果不是和范围查询一样吗?反正反B+树的数据结构来思考我是理解不了。各位大佬能帮忙解释一下吗?还是优化器在其中起作用了?

具体的实例如下,按B+树的结构来说,使用c2使用like后因为是范围查询,c3应该是无序的,怎么用索引呢?

图片

图片说明

图片说明

shanxiaoshuai
shanxiaoshuai 回复jingluan666: 你好,我把图片放在正文里了,是教程里的例子,我自己验证也是这样的
大约 2 个月之前 回复
shanxiaoshuai
shanxiaoshuai 回复jingluan666: 你好,我把图片放在正文里了,是教程里的例子,我自己验证也是这样的
大约 2 个月之前 回复
jingluan666
jingluan666 最好把分析的结果截图,标出差一点
大约 2 个月之前 回复
jingluan666
jingluan666 创建表结构、索引的语句及是怎样分析索引的sql语句发出来看看吗
大约 2 个月之前 回复

2个回答

shanxiaoshuai
shanxiaoshuai 你好,这个帖子的内容应该都是来自尚硅谷的mysql教程,我就是看了教程来的,并没有解决我的问题
大约 2 个月之前 回复

MYSQL中B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录 ; 只要满足最左前缀,就可以利用上索引。这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符 ;
你的联合索引是c1 , c2 , c3 , 你的where条件中包含了c1 , c2 , c3 , 所以按照最左N个字段来看以及 c2 字段最左M个字符来看 , 可以用到c1 , c2 , c3 的索引 ; 如果你把 c2 的搜索条件改成 like '%c' 结果就不一样了

qq_38167579
农夫丶果园 回复shanxiaoshuai: 不太明白你这个例子想表明的具体意思 ; 首先你建立的就是(c1 , c2 , c3)的联合索引 , 你这个sql的where条件c1,c2就已经能用上这个索引了 , 跟 c 的值有什么关系呢 ?
大约 2 个月之前 回复
shanxiaoshuai
shanxiaoshuai 我举个例子:select * from table1 where c1=a and c2 like 'c%' and c3=c; 这条语句,假设查询到c2以后的索引情况为(a,ca,1),(a,ca,2),(a,ca,3),(a,cb,1),(a,cb,2),(a,cb,3),这个时候c的索引键值为1,2,3,1,2,3还能用上索引吗
大约 2 个月之前 回复
shanxiaoshuai
shanxiaoshuai c1,c2能用上可以理解,但c2虽然用上了,确是范围索引,范围索引后的c3还能生效吗?
大约 2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐