怎么优化下面这个sql;SELECT from SELECT t rownum = rownum + 1 AS ranking from SELECT rownum = 0 r SELECT tagentId tcustomerCount
可以优化的地方有:
-
使用窗口函数代替变量赋值:将
@rownum := @rownum + 1 AS ranking替换为ROW_NUMBER() OVER (ORDER BY t.customerCount DESC, t.agentId ASC) AS ranking。窗口函数在MySQL 8.0版本及以上才支持,如果使用的是较低版本,可以考虑将此部分的逻辑放到应用层进行处理。 -
使用连接查询代替子查询:将内部的子查询改为连接查询,可以提高查询性能。将子查询部分改为以下形式:
SELECT
ac.agentId,
count(1) as customerCount
FROM
agent_customer ac
JOIN
user_base_info ubi ON ac.agentId = ubi.id
JOIN
sys_agent_info sai ON ubi.agentJobNumber = sai.jobNumber
WHERE
ac.createTime > '2023-07-01'
AND sai.branchOfficeCode = '8637'
GROUP BY
ac.agentId
HAVING
count(1) > 4
综上所述,优化后的SQL如下:
SELECT
*
FROM
(
SELECT
t.*,
ROW_NUMBER() OVER (ORDER BY t.customerCount DESC, t.agentId ASC) AS ranking
FROM
(
SELECT
ac.agentId,
count(1) as customerCount
FROM
agent_customer ac
JOIN
user_base_info ubi ON ac.agentId = ubi.id
JOIN
sys_agent_info sai ON ubi.agentJobNumber = sai.jobNumber
WHERE
ac.createTime > '2023-07-01'
AND sai.branchOfficeCode = '8637'
GROUP BY
ac.agentId
HAVING
count(1) > 4
) t
) t
WHERE
t.agentId = 63039
``
原文地址: https://www.cveoy.top/t/topic/h7wd 著作权归作者所有。请勿转载和采集!