Java面试高频场景题:InnoDB索引失效的场景
面试官在工作中你如何确保你的查询语句能走到索引面试者可以通过explain去查看执行计划里面有个字段是可能用到的索引。面试官索引有联合索引explain里面用到的索引可能只是走到了联合索引的部分字段那你怎么确保所有的联合字段都能走到有哪些场景可能会导致走不到面试者不满足最左匹配原则、范围查询、类型转换等。面试官那为什么这些场景就会失效呢面试者...........OK,其实讲到索引相关的面试题一定离不开InnoDB的索引结构也就是B树。失效场景也跟B树息息相关。基于树去提升查询性能有一个关键点就是数据一定是有序的。当多个字段联合组建索引时先根据第一个字段排序如果第一个字段相等再根据下一个字段排序以此类推。索引查询的本质就是利用这种有序性来快速缩小数据扫描范围。再回过头来看不满足最左匹配原则也就是我联合索引的前一个字段不包含在查询条件中直接基于后续的字段去查询的场景这个场景下后续的字段一定是无序的因为前一个字段没有确定一个固定相等的值。同样范围查询会使下一个索引列失效因为前一个字段是个范围不是一个相等的值后续字段也是无序的。包括类型转换不同类型的排序的规则不一样查询的时候如果类型都转换了。那顺序也一定不一样。导致失效。总结来说分析索引是否失效关键在于判断查询条件能否利用索引键的有序性来快速定位数据。失效的各种场景都是不能按照原有的顺序去检索不能减少检索数据的范围。但需要注意的是能不能走最终还是由优化器来决定。优化器会基于数据分布如某个值的选择性、表大小、查询成本等因素选择它认为最快的执行计划。有时即使索引在理论上有用优化器也可能因为回表成本过高等原因选择全表扫描。我们看有没有走可以基于执行计划中的检索行数来判断。我们去优化sql语句关键也是去优化检索的行数。