MySQL索引失效的几种情况【不定期更新完善】

  • Post author:
  • Post category:mysql




1. 最佳左前缀法则

如果一张表的索引有多个,要遵守最佳左前缀法则,即查询从索引的最左前列开始并且不跳过索引中的列。



2.like查询使用不当会导致索引失效

通配符%在开头位置

select * from tb_user where name like ‘%xiaoai’;

这时候就会导致索引失效



3.在索引列上做加工操作(一般指运算和函数)

在索引列上做加工操作,查询时会导致索引失效,从而导致全表扫描。所以,建议不要在索引列上做任何操作。

举个例子,例如订单表tb_order有个索引是dt(日期), 字段数据存放的格式是这样的2021-12-10 这样的,如果有个需求需要根据dt,格式是20220207这样的来查询,这时候就不要对dt进行格式转换了,

select * from tb_order where DATE_FORMAT(dt,’%Y%m%d’) =‘20220207’

这样索引就失效了。

而是应该对 20220207做格式处理

select * from tb_order where dt=DATE_FORMAT(‘20220207’,’%Y-%m-%d’)

这样dt索引才不会失效。



4.查询条件两边数据类型不一致

例如我们在订单表tb_order建立了索引idx_order_id,order_id字段类型为varchar

在查询时使用where order_id= 20220207123654100,这样的查询方式会直接造成索引失效。

正确的用法为where order_id=’20220207123654100’



版权声明:本文为whlqunzhu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。