mysql as用法索引失效_Mysql索引失效情况

本文列举了MySQL中索引失效的多种情况,包括查询条件使用or、字符串类型的条件未加引号、连接查询中编码不一致等,并给出了部分解决建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql索引失效有以下几种情况:

1、查询条件中有or (普通索引)

a818fed1e40dbbd8249e4ec84e1ffd4c.png

2、like查询是以'%'开头

9fceea339142852d92fecb1abdc9d6ec.png

但是如果想让以‘%’开头仍然使用索引,则需要使用覆盖索引,即只查询带索引字段的列:

EXPLAIN SELECT name FROM  `user` WHERE  name  like  '%张三'

41e6ae08efb144e5810ae8114e99bde8.png

3.对查询的列上有运算或者函数的

explain SELECT name,age,address FROM user where substr(name,-2)='头强'

EXPLAIN SELECT * FROM  `user` where age+1

bcfe3fcd13eb8a31382edd26b07b6130.png

4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

explain SELECT name,age,address FROM user where name = 10

179ed2ce5310e07d1fceec4053a626c6.png

这里面的原因其实跟例3是一样的,首先mysql有个类型转换规则就是将“字符转成数字”,所以以上sql就等价于这样:

explain SELECT name,age,address FROM user where cast(name as signed)= 10

5、左连接查询或者右连接查询查询关联的字段编码格式不一样

注意user 表的name字段编码是utf8mb4,而school表的name字段编码为gbk。执行左外连接查询:

explain SELECT a.*,b.* FROM  user as a LEFT JOIN school as b on a.name = b.name;

e4a71b1fd93f1d8fa09d5974c5e9a402.png

6、如果mysql估计使用全表扫描要比使用索引快,则不使用索引

7、连接查询中,按照优化器顺序的第一张表不会走索引

8、如果查询中没有用到联合索引的第一个字段,则不会走索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值