概述
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的修改又需要加写锁。所以本来的行级写锁变为了表级写锁。并发能力大大降低!
最后
以上就是寂寞跳跳糖为你收集整理的mysql按照like做索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...的全部内容,希望文章能够帮你解决mysql按照like做索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复