标签:程序 abd 外键 title 复数 tab 高可用 操作 重复
在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时,故先不显示结果
以下是对这条查询的优化记录
数据库配置:4C8G
主表数据:3W+
提取sql语句,简化如下
SELECT
taba.id,
taba.title,
taba.type,
taba.end_time,
tabb.username,
tabc.orgname
FROM
taba
LEFT JOIN tabd ON tabd.info_id = taba.id
LEFT JOIN tabe ON tabe.sdo_id = taba.id
LEFT JOIN tabb ON tabb.id = taba.creator
LEFT JOIN tabc ON tabc.id = taba.organization_id
WHERE
taba.`STATUS` = ‘PUBLISH‘
AND tabd.type = ‘INDEX‘
AND tabd.`VALUE` = ‘1‘
AND taba.info_type = ‘SUPPLY‘
GROUP BY
taba.id
ORDER BY
taba.create_time DESC
LIMIT 100
首先第一反应,查sql是否走了索引
EXPLAIN
select ......
从索引检查结果发现
tabe
只有主键索引,没有sdo_id
的索引sdo_id
是通过uuid制作,重复数很少,可以增加上索引经过添加索引,数据查询时间降低到3秒以内,所以正确的索引才是王道
经过与开发人员沟通,确定可以每次只取10条数据,所以要求他们更改limit语句限制为limit 10
经过修改limit语句,数据库直插时间已经变味1.7秒
conut *
经过前两部优化,按理2秒左右app就能显示数据,但是时间上却需要4秒钟
通过sql慢查询日志,发现在这条sql执行前,spring框架自动执行了一个select count(0) from (......)
的操作来做分页,但是所以导致查询时间是理论上的2倍
再次与开发确定,不用框架的自动分页功能,改为代码层手动分页
结果修改框架的分页,app查询时间达到2秒内,已基本得到解决
查询优化到2秒,已基本可以接受,但是先到数据才3万多行,感觉还是不能接受,继续找原因,发现如下:
观察sql语句,可以发现是先做了多次left join
后,对结果取limit
,那能不能先取limit 10
再进行查询呢,于是把sql优化如下
SELECT
taba.id,
taba.title,
taba.type,
taba.end_time,
tabb.username,
tabc.orgname
FROM
taba
LEFT JOIN tabd ON tabd.info_id = taba.id
LEFT JOIN tabe ON tabe.sdo_id = taba.id
LEFT JOIN tabb ON tabb.id = taba.creator
LEFT JOIN tabc ON tabc.id = taba.organization_id
WHERE
tabd.type = ‘INDEX‘
AND tabd.`VALUE` = ‘1‘
AND hsoi.id IN (
SELECT *FROM
(
SELECT id FROM taba
WHERE `STATUS` = ‘PUBLISH‘
AND info_type = ‘SUPPLY‘
ORDER BY taba.create_time DESC
LIMIT 10
) AS t
)
优化方法:
id
数据id
拿去前面做join优化结果
其实sql中还有几个可以优化的地方,比如:
left join
中的3个可以改成inner join
group by
,经测试改掉可优化0.3秒(1.7秒处)但是:
标签:程序 abd 外键 title 复数 tab 高可用 操作 重复
原文地址:https://www.cnblogs.com/noah-luo/p/12695117.html