Explain分析?
关于Explain具体可以干什么,有哪些优缺点,本博主的文章有写到,这是链接地址: 点击这里查看. 下面来说下Explain在项目实战中,如何去进行优化。
问题描述
简单描述一下问题:今天项目经理安排了一个艰巨的任务,xx去优化一下xx那个查询语句,前端列表显示太慢了,影响客户体验,抱着这个问题,我先去查询了一下后端接口,确定了哪个接口下,便找到了SQL语句
贴到了下面,在我还没说怎么优化前,大家可以先去看一下
仔细分析一下这段SQL语句先去进行左连接
left join
,再去进行内连接inner join
,经过反复执行,最终确定了问题,出在了inner JOIN sg_device_relevance b ON c.id = b.member_id
注释或者使用left join查询后,问题一:查询出来的数据不对,问题二:查询速度反而比之前更慢了
解决方案
SELECT c.id, c.NAME AS 'name', c.sex, c.phone, c.three_tag, c.dept_id, c.region, c.compliance, c.sys_org_code, a.measuring_time FROM sg_member c LEFT JOIN sg_blutdruck_record a ON c.id = a.member_id AND a.measuring_time BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW() inner JOIN sg_device_relevance b ON c.id = b.member_id WHERE 1 = 1 and c.sys_org_code = 'A02A01' AND a.id IS NULL GROUP BY c.id
根据上面的SQL,看下我没加索引前的执行结果,查询时间时
3秒多
,在select前面加上EXPLAIN
关键字,分析结果如下,type:代表扫描类型,类型为ALL代表全局扫描,possible_keys:代表应该用到哪些索引,key:代表实际用到的索引,
有些人就开始疑惑了,为什么实际没有用到索引呢,原因是PRIMARY,unique验证唯一值索引,再此处用不上
我这个地方分割一下,继续往下说,一定要讲明白,非常重要这块,不仅在项目中可以用到,面试也常问
,不明白的可以私信.
rows:代表检索的数据行数,Extra:代表检索结果,Using index就是用到了索引,很明显这个地方结果返回没有用上,另外type检索类型也是全局检索,type具体有几种类型可以去博文中查询,在本文章上方我贴上文章地址了
,这些我都解释完了,下面看下我优化后的查询结果
优化后
-- 向a表添加索引 create index device_relevancekey on sg_device_relevance(member_id) -- 向B表添加索引 create index blutdruck_record on sg_blutdruck_record(member_id,measuring_time)
看下这时的
type:ref
,明显这次没有用全局扫描,C表我没加索引的原因呢是:在此处查询中为主表,看下a和b表,实际用到的索引和应该用到的索引一直,说明用到了索引,Extra:a和b表的扫描结果为Using index
,说明索引生效了,查询时间为0.21秒,比刚才快了3秒多
,注意:这次优化我没有去改SQL,而是加了索引
,其实改SQL也可以,但是我这样做呢,其他查询也会同样速度比之前快了很多本次分享就到这里啦,如果有不明白的地方可以私信本博主,后期会分享更多在项目中遇到的实战技术及问题