本题考查索引生效和失效的条件。这样的问题其实很有意义。我建议大家以后面试其他合伙人的时候,多关注问这样的问题,比考察笼统的概念题要好很多。可以粗略的看应聘者是否注重优化写好的程序,提高代码质量和程序性能,或者只是一份简单的简历。联合索引失败的条件联合索引也称为复合索引。两个或多个列上的索引称为复合索引。对于复合索引:Mysql从左到右使用索引中的字段,一个查询只能使用索引的一部分,而且只能使用最左边的部分。例如索引是键索引(a,b,c)。可以支持一个|一个,乙|a,b,c3种组合进行搜索,不支持b,c进行搜索。当最左边的字段是一个常量引用时,索引是有效的。使用索引中的附加列,您可以缩小搜索范围,但是使用一个索引和两个列与使用两个单独的索引不同。复合索引的结构类似于电话簿的结构。一个人的名字由名字和姓氏组成。电话簿首先对成对的姓氏进行排序,然后按名字对具有相同姓氏的人进行排序。如果您知道自己的姓氏,电话簿会很有用; 如果你知道自己的名字和姓氏,电话簿会更有用,但如果你只知道名字,就没有用了。所以在创建复合索引时,要慎重考虑列的顺序。当对索引中的所有列或仅对前几列执行搜索时,复合索引非常有用;当仅对以下任何列执行搜索时,它们是无用的,例如:构建姓名、年龄和性别的复合索引。创建表myTest(aint,bint,cint,KEYa(a,b,c));(1)select*frommyTestwherea=3andb=5andc=4;----abc顺序where条件中用到了abc的三个索引,它们都起作用了(2)select*frommyTestwherec=4andb=6anda=3;where中的条件顺序在查询前会被mysql自动优化,效果同上一句(3)select*frommyTestwherea=3andc=7;a使用了索引,b没有用,所以c没有使用索引的作用(4)select*frommyTestwherea=3andb>7andc=3;----brangevalue,breakpoint,blocking索引用了,b也用了,c没用,这个地方b是范围值,也算点,但是索引本身用到了(5)select*来自myTest,其中b=3和c=4;---联合索引必须按顺序使用,全部都需要使用,因为没有使用a索引,所以bc在这里没用上索引作用(6)select*frommyTestwherea>4andb=7和c=9;a用了,b不用了,c不用了(7)select*frommyTestwherea=3orderbyb;a使用了索引,b在结果排序中也使用了索引的作用。a下面的任何部分中的b都已排序(8)select*frommyTestwherea=3orderbyc;a使用了索引,但是这个地方c没有排序的效果,因为中间断点,用explain看filesort(9)select*frommytablewhereb=3orderbya;b没有使用索引,a做在排序中没有发挥索引的作用最后说一下索引Invalidconditions不要对索引列进行任何操作(计算,函数,(自动或手动)类型转换),这将导致索引失效并转到全表扫描。存储引擎不能使用索引范围条件右侧的列。索引查询(索引列与查询列一致)),reduceselect*mysql在使用不等于(!=或<>)时不能使用索引,会导致全表扫描为null,isnotnull不能使用索引like通配符('%abc...')开头的mysql索引失效会变成全表扫描操作问题:like'%string%'时索引不被使用如何解决?SELECT*fromstaffswherename='2000';--因为mysql会在底层进行隐式类型转换SELECT*fromstaffswherename=2000;---未使用索引建议对于单键索引,尽量选择对当前查询过滤性更好的索引。选择复合索引时,当前查询中过滤性最好的字段应该按照索引字段的顺序排列,位置越高越好。在选择复合索引时,尽量选择在当前查询的where子句中可以包含更多字段的索引。尝试分析统计信息并调整查询的措辞,以达到选择合适索引的目的。来源:https://smiletimli.blog.csdn....近期热点文章推荐:1.1000+Java面试题及答案(2021最新版)2.别再满脑子if/else了,试试攻略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
