首页 新闻 会员 周边

关于mysql的复合索引的初级问题

0
悬赏园豆:10 [已解决问题] 解决于 2020-11-11 16:42

https://blog.csdn.net/qq_37591656/article/details/99172693

这个里面的表,建立了c1,2,3,4的复合索引
为啥c1单独查就可以使用了索引,c2就不行...然后c1+c2又可以用索引了..

想请教一下这是为什么,或者有什么相关的文章推荐一下吗

问题补充:

Phoenix_Ou的主页 Phoenix_Ou | 初学一级 | 园豆:187
提问于:2020-11-08 22:29
< >
分享
最佳答案
1

你看下《高性能MySQL》,你看看我博客里画的图:MySQL优化技巧

可以这样理解:比如有一堆学生,每个学生都有姓名和编号,如果你用姓名和编号做多列索引,姓名在前。如果学生按索引列排队的话:首先姓名靠前的排前面,如果多个人姓名相同,那么学号靠前的排前面。 这样就很直观地看出,为什么用姓名可以,用姓名+编号也可以,但是用编号却不行了。给你给示例数据你想想:

{'阿宝', 8},
{'卜均生', 1},
{'曹操', 2},
{'党项族', 3},
{'刘备', 5},
{'刘备', 6},
{'刘备', 7},
{'张飞', 4}

总而言之,就是:首先按照第一列排序,如果第一列相同,才按第二列排,如果第二列再相同,才按第三列排。
如果有个多列索引[a,b,c],用a、ab、abc做查询条件时都可以用到索引,但是用b、bc等就不行了,需要另外单独建立索引

收获园豆:10
会长 | 专家六级 |园豆:12401 | 2020-11-09 10:47

为啥不能按学号排队啊,直接
{'卜均生', 1},
{'党项族', 3},
{'张飞', 4}
{'刘备', 5},
{'刘备', 6},
{'刘备', 7},
这样不行吗,还是说必须先按姓名排完才能按学号排

Phoenix_Ou | 园豆:187 (初学一级) | 2020-11-10 11:01

@Phoenix_Ou: 我举的例子是用姓名和学号做联合索引的情况,实际上是个树形结构,也不是这样的线性的,但是可以简单理解为先用姓名后用学号排序。如果直接按学号排序,就类似于索引是学号的情况

会长 | 园豆:12401 (专家六级) | 2020-11-10 15:45
其他回答(5)
1

复合索引有顺序的,所以c1可以,c2不行,你用c2+c1试试,我印象中这样也不行

浅草青晨 | 园豆:904 (小虾三级) | 2020-11-09 09:21
0
通信的搞程序 | 园豆:1747 (小虾三级) | 2020-11-09 10:03
0

mysql 复合索引对查询条件 顺序有要求的,也是他建立索引的顺序。详细查阅官方文档

flyfishing | 园豆:943 (小虾三级) | 2020-11-09 10:40
1

mysql复合索引遵循最左原则,
即c1,2,3,4索引的话
c1
c1,c2
c1,c2,c3
c1,c2,c3,c4
这样的的都是可以用到索引的。其他2,3,4开头的都是没用的。
当然最终搜索的时候用没用到还得看mysql内部优化器处理结果。

阅尽三千 | 园豆:332 (菜鸟二级) | 2020-11-09 16:54
0

“mysql复合索引遵循最左匹配原则” 道出了索引生效的重点

Ctrl` | 园豆:3317 (老鸟四级) | 2020-11-09 17:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册