https://blog.csdn.net/qq_37591656/article/details/99172693
这个里面的表,建立了c1,2,3,4的复合索引
为啥c1单独查就可以使用了索引,c2就不行...然后c1+c2又可以用索引了..
想请教一下这是为什么,或者有什么相关的文章推荐一下吗
你看下《高性能MySQL》,你看看我博客里画的图:MySQL优化技巧。
可以这样理解:比如有一堆学生,每个学生都有姓名和编号,如果你用姓名和编号做多列索引,姓名在前。如果学生按索引列排队的话:首先姓名靠前的排前面,如果多个人姓名相同,那么学号靠前的排前面。 这样就很直观地看出,为什么用姓名可以,用姓名+编号也可以,但是用编号却不行了。给你给示例数据你想想:
{'阿宝', 8},
{'卜均生', 1},
{'曹操', 2},
{'党项族', 3},
{'刘备', 5},
{'刘备', 6},
{'刘备', 7},
{'张飞', 4}
总而言之,就是:首先按照第一列排序,如果第一列相同,才按第二列排,如果第二列再相同,才按第三列排。
如果有个多列索引[a,b,c],用a、ab、abc做查询条件时都可以用到索引,但是用b、bc等就不行了,需要另外单独建立索引
为啥不能按学号排队啊,直接
{'卜均生', 1},
{'党项族', 3},
{'张飞', 4}
{'刘备', 5},
{'刘备', 6},
{'刘备', 7},
这样不行吗,还是说必须先按姓名排完才能按学号排
@Phoenix_Ou: 我举的例子是用姓名和学号做联合索引的情况,实际上是个树形结构,也不是这样的线性的,但是可以简单理解为先用姓名后用学号排序。如果直接按学号排序,就类似于索引是学号的情况
复合索引有顺序的,所以c1可以,c2不行,你用c2+c1试试,我印象中这样也不行
mysql 复合索引对查询条件 顺序有要求的,也是他建立索引的顺序。详细查阅官方文档
mysql复合索引遵循最左原则,
即c1,2,3,4索引的话
c1
c1,c2
c1,c2,c3
c1,c2,c3,c4
这样的的都是可以用到索引的。其他2,3,4开头的都是没用的。
当然最终搜索的时候用没用到还得看mysql内部优化器处理结果。
“mysql复合索引遵循最左匹配原则” 道出了索引生效的重点