mysql按照like做索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...

like百分号加前面一定不走索引吗?

正常来讲,我们都知道在mysql的like查询中,百分号加在关键词后面是走索引的,比如 select * like "张三%",而百分号在前面是不走索引的,比如 select * like "%张三",但也有例外。如果你的字段有id,a,b,c四列。而你对abc三列加了索引的话。那无论如何,like都会走索引的。因为如果能走覆盖索引的话。mysql会优先走覆盖索引。

同时,如果id,a,b,c四列,仅对a列做了索引,select a from table where a like "%张三%"也同样是会走覆盖索引的

like如果走了索引,或者范围查询后面的字段还走不走索引?

假设abc加了索引,select a from table where a like "张三%" and b = 18,那b走不走索引?不一定,根据索引的底层原理,a字段是确定值,b字段才会走索引。所以范围查询后面不走索引只是一个偷懒的说法。如果范围查询过后的a是个确定值,那后面还是走索引的,否则不走

abc创建了索引,where条件和索引顺序不一致走不走索引?

abc创建了索引,select * from table where a = 1 and c = 3 and b = 2 走不走索引?走的,mysql底层会针对sql语句进行一定的优化。该sql几个and的顺序调整对最终结果的正确性没有影响,但却会走不走索引的查询效率影响较大。sql很乐意做这样的优化

or走不走索引?

我们经常会听到or走索引,或者or不走索引的简单说法,其实这里是分情况的

如果针对某个字段的or是走索引的,比如 select * from table where ( a = '3' or a = '4') ;

如果针对多个字段的or是不走索引的,比如 select * from table where ( a = '3' or b = 4) ;

排序走不走索引?

select * from table where a = '张三' and b = 18 order by c asc,排序字段c走不走索引?走的!

abc正好顺序的出现在组合索引当中,但有个点要注意的是,如何知道排序走没走索引。一般走没走索引通过explain当中的key能看出来。但在刚才的sql中,由于a已经走了索引,c走不走索引无法通过key看出来,而只能通过extra中的信息来看,如果extra出现了filesort说明没有用到索引。

引申一下,和c的场景类似,如果知道b走没有索引。只能通过和单独a条件,比较key_len来确定,如果b走了索引,key_len是会变长的。否则没走

提防隐式转换

有一种比较低级错误,比如我有个字段名a,保存内容为年龄,但是误用了varchar字段,那 select a from table where a = 18,走不走索引?不走的,虽然mysql很智能,这个sql没有报错,但是mysql为此针对列a做了字符串到数字的转换,我们都知道一旦针对某个字段做了函数转换,那就不走索引了。再引申一下,索引失效以后 update table set b = 10086 where a = 18,由于索引失效,针对a的查询需要全表扫描,针对a的修改又需要加写锁。所以本来的行级写锁变为了表级写锁。并发能力大大降低!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值