Mysql索引失效的场景分析

前言:

日常使用Mysql做一些业务时,发现很慢,跟踪日志返现是有慢查询语句,于是使用explain查看执行计划发现是没有使用到索引,一般这些情况都不是java框架导致的,一般框架里都会根据主键或者指定的条件去做简单的查询,复杂的查询都是通过sql原生写法来实现的,这种原生写法最容易产生类似这样的问题。

产生索引失效的场景

1、在sql中使用了函数,比如sum,count等内置函数,这种情况下即使where条件中使用到了索引也会索引失效。
2、在where语句中使用到了联合索引,但是使用的时候违反了最左原则。比如联合索引创建的时候为name,age 但是使用的时候确实where age = 1 and name = ‘cz’,这样会导致age的索引失效仅剩name索引。
3、在查询语句中一些字段的属性错误,比如name的字段定义为varchar,但是使用的时候条件写成了where name=cz,这样会导致mysql在真实查询的时候查找索引失败。
4、在sql中,如果使用模糊查询,但是字段为全模糊的比如:where name like ‘%cz%’,这种场景下索引是失效的,如果使用的语句为where name like ‘cz%’,那么这种索引反而是生效的。
5、在查询语句中出现了or,那么这个语句是不会使用到索引的

以上这些就是在写sql时经常遇到的一些索引失效的场景。

如果在java中,如果使用mybatis则需要手写sql,所以上面的场景需要格外注意。

其他慢sql调优手段

1、避免使用select * 多余的字段会消耗IO

2、使用索引

3、使用join替换in(看具体数据库来决定)

原因:分布式数据库exists效率低

4、join优化,如果执行计划中有使用Block-Nasted-Loop,需要根据实际情况增加缓存区的内存空间

5、大结果集的排序,如果结果集很大会涉及到文件排序(File-sort),需要根据业务拆分为小结果集再排序
6、在使用inner join时,如果优化器判断有误,这个时候要使用straght join来指定驱动表 hint方式

7、在查询语句中如果优化器使用索引不合理,需要使用FORCE INDEX指定索引。hint方式

8、delete/update关联操作,DML直接JOIN关联两张实体表,改成关联1张实体表和1个Join结果集

9、大事务拆分提交,如果一次事务太大可能会堵塞小事务的提交

10、使用group by进行分组查询时,默认会按照分组字段进行排序,也就是默认会在语句后面添加order by

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值