可以优化的地方有:

  1. 使用窗口函数代替变量赋值:将@rownum := @rownum + 1 AS ranking替换为ROW_NUMBER() OVER (ORDER BY t.customerCount DESC, t.agentId ASC) AS ranking。窗口函数在MySQL 8.0版本及以上才支持,如果使用的是较低版本,可以考虑将此部分的逻辑放到应用层进行处理。

  2. 使用连接查询代替子查询:将内部的子查询改为连接查询,可以提高查询性能。将子查询部分改为以下形式:

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
``
怎么优化下面这个sql;SELECT from SELECT t rownum = rownum + 1 AS ranking from SELECT rownum = 0 r SELECT tagentId tcustomerCount

原文地址: https://www.cveoy.top/t/topic/h7wd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录