记录一次单表百万慢SQL优化

这是一个电商项目

由于双十一来临,项目订单数据量极具上升。一下子就上升到百万级别的数据了,业务就反映后台订单查询加载很慢。

然后我就去慢日志文件了查看果然发现这条SQL执行时间已经上升到了5秒多,我记得当时才几十毫秒。

于是我就开始把这条SQL复制出来,开始研究怎么优化。

我一般优化的思路(1、检查SQL语法是否有问题(比如用了子查询,或者说大表连小表) 2、是否建立了索引 3、是否索引失效导致全表扫描,4、检查mysql服务磁器盘cpu、5、数据量太大是否需要分库分表)

首先看SQL语句

记录一次单表百万慢SQL优化

噗 有点长 可以点击格式->美化SQL 就成这样了 看起来舒服一点

记录一次单表百万慢SQL优化

我们先检查SQL语法有没有问题 订单查询 一般首先查的是订单表然后再去链接其他关联表进行查询

检查之后发现没有问题 我们在本地执行一下 

咦 发现速度很快 才17ms

记录一次单表百万慢SQL优化

原来是我本地数据量太少 ,于是我准备忘订单表批量插入数据

insert into c2m_order (name.....)  select  name ,... c2m_order 

这样每执行一次数据就每次多了两倍 直到我数据库变成了200多万

在执行一次

记录一次单表百万慢SQL优化

啊 变成了6秒。。。。。

我们用EXPLAIN 查看一下SQL的执行计划,我们发现订单表type类型为ALL 也就是没有用到索引 扫描了全表 

记录一次单表百万慢SQL优化

这下我们找到问题了 看看该如何解决 看下面这部分SQL

记录一次单表百万慢SQL优化

只有两个条件还有一个分页 ,一个是删除标志 一个是创建时间倒序

我们再看一下这张表的索引结构

记录一次单表百万慢SQL优化

我们发现这两个字段都是没有索引的,大家都知道数据库主键是默认会建主键索引

我们把create_date 创建时间换成id 试试

记录一次单表百万慢SQL优化

我们发现已经用上了type级别为index 说明已经用上了索引 我们再看看 执行的时间已经变了25ms 大大的减短了时间 

记录一次单表百万慢SQL优化

可是我们总不能按id排序了业务不允许啊

所以我们给create_date加上索引 

记录一次单表百万慢SQL优化

我们再看看执行计划和执行时间

记录一次单表百万慢SQL优化

新建的那个索引已经用上了

记录一次单表百万慢SQL优化

时间也变成了18ms了,大功告成,赶快去正式库加了个索引,立马就解决了问题。