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’

MySQL索引失效情况有以下几种: 1. 数据量过小:当表中记录的数量较少时,使用索引可能会变得不必要,因为MySQL可能会选择全表扫描而不是使用索引。这种情况下,索引就会失效。 2. 不适当的索引设计:如果索引的设计不合理,那么它可能无法有效地支持查询。例如,如果索引列的选择不合适,或者多个列被组合在一个索引中,但查询只使用了其中一部分列,索引就会失效。 3. 使用了函数或表达式:如果在查询中使用了函数或表达式,并且该函数或表达式无法使用索引进行优化,那么索引可能会失效。例如,如果在WHERE子句中使用了函数操作符,或者将列的值与一个常量进行比较,索引可能就不会被使用。 4. 数据类型不匹配:如果索引列和查询中的条件列具有不同的数据类型,那么索引可能会失效。例如,如果索引列是字符串类型,而查询中的条件列是数字类型,索引就不会被使用。 5. 数据分布不均衡:如果数据在索引列上的分布不均衡,即某些值出现频率较高,而其他值出现频率较低,那么索引可能会失效。这是因为MySQL可能认为全表扫描比使用索引更高效。 要避免索引失效,可以通过以下方法进行优化: - 确保正确选择和设计索引,根据查询的需求创建合适的索引。 - 避免在查询中使用不必要的函数或表达式。 - 确保索引列和查询中的条件列具有相同的数据类型。 - 定期更新统计信息,以帮助MySQL优化查询计划。 - 使用合适的数据类型和数据分布,以避免数据倾斜。 这些是一些常见的导致MySQL索引失效情况和优化方法。根据具体情况进行分析和调整,可以提高查询性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值