mysql索引失效的几种场景?
1.1 不满足最左匹配原则
查询条件中,只要有最左边的索引字段,就会走索引;和where条件字段顺序无关,即使中间断了层也能走索引。
1.2 使用了select *
sql中使用了select *,从执行结果看,走了全表扫描,没有用到任何索引,查询效率非常低。
如果select语句中的查询列都是索引列,那么就走了覆盖索引,查询效率相对高些。
1.3 order by导致索引失效
实际开发过程中经常会使用到order by,为了提高order by的查询效率,建议把order by字段和select字段添加联合索引。但是如果实际需求经常变更,不能总是修改联合索引。可以通过给order by字段增加索引,先通过子查询查询到id,然后再手动回表查询所需要的字段。
1.4索引列上有计算或使用了函数
会对索引列进行一次重新计算。
1.5字段类型不同可能导致索引失效
varchar类型字段作为索引列的查询条件,如果该字段传参是int类型导致索引失效;
int类型字段作为查询条件,它会自动将该字段的参数进行隐式转换,把字符串换成int类型。
1.6 like左边包含了%
当like语句中的%出现在查询条件的左边时,索引会失效;但是如果我们使用覆盖索引就不会失效。
1.7 列对比
如果把两个单独建了索引的列用来做对比时索引会失效;
走覆盖索引的话是可以走索引的。
1.8 使用or关键字
or关键字前后两个字段都增加了索引,8.0版本以上会走索引,之前版本都不会走索引。
1.9 使用!=,<>,is null,is not null操作符
mysql5.7版本<>不等于会导致索引失效;但是mysql8.0还是会走索引。
不走索引场景解析:其实它是可以走索引的,如果返回结果集大于20%,那么它不会走索引。
1.10 范围查询数量过多导致索引失效
在我们开发过程中如果遇到范围条件,范围查询尽可能精确一点。
SQL性能调优
2.1 为 WHERE 及 ORDER BY 涉及的列上建立索引
2.2 慎用 OR、 IN 、NOT IN、左模糊like
很多时候用exists 代替in 是一个好的选择
可以使用 UNION ALL代替OR
2.3 尽可能的使用 varchar, nvarchar 代替 char, nchar
varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间;
2.4 使用“临时表”暂存中间结果
2.5 用批量插入或批量更新
2.6 将不需要的记录在 GROUP BY 之前过滤掉
2.7 当只要一行数据时使用 LIMIT 1
2.8 禁止在数据库中存储图片,文件等大的二进制数据