慢SQL原因分析之索引失效
现象
最近收到一个慢sql工单,慢sql大概是这样:“select xxx from tabel where type = 1”。
咦,type字段明明有索引啊,为啥是慢sql呢?
原因
通过执行explain,发现实际上数据库执行了全表扫描,从而被系统判定为慢sql。这时有一定开发经验的同事会说:“字段区分度不够,这种字段作单独索引是没有意义的”。那么为什么会产生索引失效这种情况呢?索引失效都有哪些情况呢?
索引失效概括
下面总结了若干索引失效的情况:
不满足最左匹配
假如表中有个组合索引,idx_start_org_code_start_province_id_trans_type,它的索引顺序如下:
start_org_code,
start_province_id,
trans_type
当我们从第二个索引字段开始查询时就不会走索引:
因为索引是BTree结构的,不能跳过第一个索引直接走第二个索引
索引列上有计算
当我们用主键做条件时,走索引了:
而当id列上面有计算,比如:
可以看到走了全表扫描
索引列上有函数
有时候我们在某条sql语句的查询条件中,需要使用函数,比如:截取某个字段的长度:
你有没有发现,在使用该函数之后,该sql语句竟然走了全表扫描,索引失效了
字段类型不同
在sql语句中因为字段类型不同,而导致索引失效的问题,很容易遇
标签:11,总结,索引,start,全表,sql,失效,type From: https://www.cnblogs.com/lmyy/p/17719627.html