文章目录
- Explain
- 问题描述
- 解决方案
Explain
关于Explain具体怎么用以及有哪些优点,我就不过多的跟大家去讲解了,从我最初的文章: explain是什么?explain优缺点及如何使用explain优化SQL,大家可以点击这个链接看一下,对Explain有个基础的了解,前段时间我发表的博客文章sql 性能优化基于explain调优,讲述的时在实战当中,当我们拿到SQL语句,查询几秒甚至10及秒时,如何进行优化为几毫秒
回到正题,今天这边文章还是围绕使用Explain对SQL的性能调优问题,可见认识到了Explain的重要性了吧,此案例呢为实战案例,也是我在项目中遇到的SQL性能调优问题
问题描述
先来看下需要进行优化的SQL语句
SELECT
m.`name` AS memberId_dictText,
o.type AS type_dictText,
i.`name` AS taskId_dictText,
o.number AS number,
o.create_time AS createTime,
g.`name` AS goodsId_dictText,
o.`code`,
o.is_make AS isMake,
o.end_time AS endTime
FROM
sg_operation_records o
LEFT JOIN sg_member m ON o.member_id = m.id
LEFT JOIN sys_user u ON m.doctor_id = u.id
LEFT JOIN sg_item i ON i.id = o.task_id
LEFT JOIN sg_goods g ON goods_id = o.goods_id
AND g.sys_org_code = m.sys_org_code
WHERE 1 = 1
-- AND o.type = #{recordType}
-- AND g.is_on_sale = 1
-- AND g.is_delete = 0
-- AND u.id = #{doctorId}
AND m.sys_org_code = 'A02A01'
-- AND m.name like CONCAT('%', #{name},'%')
前端查询时报了一个这样的错误
解决方案
这个错误很明显是前端调用后端,由于长时间没收到后端的回复,超时了,我的解决思路是,打下断点,看看是后端报错了吗,跑了一下程序,后端是没有问题的,然后我的目光转向了XML文件里的SQL,在数据里执行了一下SQL语句,查询时间为2秒多
回到SQL语句中查看这是一个五个表连接查询的SQL语句,主表为sg_operation_records
,sg_operation_records
表的外键关联为member_id
和goods_id
这两列,向这两列添加复合索引
create index key_operation_records on sg_operation_records(member_id,goods_id)
查看及添加索引语法(以复合索引为例)
//添加索引
create index 索引名称 on 表名(列名,列名)
// 查看索引
show index from 表名
此时已经给sg_operation_records
表中的这两列加上了复合索引
再来执行一下SQL语句,3毫秒
SQL语句没有变,只是给列加了索引
总结
在SQL性能调优时,在SQL语句select前面加上Explain关键字,怎么分析,在我本文的开头提到过来,在本博主的上一篇文章中有详细讲解,根据Explain去分析当前SQL语句是否用到索引,有没有导致索引失效等问题,再去向指定列添加索引,就可以了。
本次技术分享到此结束,有不明白或者疑问的博主,可以私信我哦 ~~~