提高sql查询选择性能

ufj5ltwl  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(344)

我有一个从多个表中提取数据的sql查询。唯一的问题是我有真的查询需要很长时间,我想知道是否有任何方式,我可以加快它。我通过使用内部连接而不是左连接做了一些小的改进,但是查询速度太慢了。

SELECT 
    clientlist.CRMContactId,
    clientlist.ClientAdviser,
    COALESCE(NULLIF(clientlist.FirstName, ""), clientlist.CorporateName) AS FirstName,
    clientlist.LastName,
    clientlist.ServiceStatusName, 
    FORMAT(t.totalfum, 2) AS "Funds Under Management",
    FORMAT(d.totalfci, 2) AS "Total Income", 
    (SELECT DueDate 
     FROM tasks 
     WHERE ClientRef = clientlist.ClientRef 
       AND `Status` <> "Complete" 
     ORDER BY DueDate DESC 
     LIMIT 1) AS NextDate, 
    (SELECT CompletedDate 
     FROM tasks 
     WHERE ClientRef = clientlist.ClientRef 
       AND `Status` = "Complete" 
     ORDER BY DueDate DESC 
     LIMIT 1) AS LastDate 
FROM 
    clientlist
INNER JOIN 
    (SELECT 
         plans.ClientId, SUM(plans.CurrentVal) AS totalfum
     FROM 
         plans
     GROUP BY 
         plans.ClientId) t ON clientlist.CRMContactId = t.ClientId
INNER JOIN 
    (SELECT 
         adviserfci.ClientId, SUM(adviserfci.Payable) AS totalfci
     FROM 
         adviserfci
     WHERE 
         IncomeType IN ("Renewal Commission", "Ongoing Fee", "Fund Based Commission") 
         OR (Incometype = "Payaway Received" 
             AND UnderlyingIncomeType IN ("Renewal", "Ongoing Fee", "Fund Based"))
     GROUP BY 
         adviserfci.ClientId) d ON clientlist.CRMContactId = d.ClientId
WHERE 
    d.totalfci IS NOT NULL

我也读过一些地方解释命令将有助于确定问题,但我不明白的React。

有什么方法可以提高这个查询的性能吗?

wtlkbnrh

wtlkbnrh1#

首先,您是否为这些表创建了索引?
如果不知道您的数据结构以及您将在其中放入什么样的查询负载,则很难说,但首先看一下,如果您还没有这些索引,我会说这些索引应该可以提高性能:
表clientlist上的crmcontactid
桌面平面图上的客户ID
通知RFCI上的客户ID(包括incometype和应付账款)
如果您还没有设置表主键,并且从列名来看,它们听起来像是不错的候选键,那么如果这样做有效的话,您可以一举两得。

xoshrz7s

xoshrz7s2#

折叠测试 d.totalfci IS NOT NULL 到生成它的子查询中,即使它需要在 HAVING 条款。
添加一些索引

tasks:  INDEX(ClientRef, `Status`, DueDate)
plans:  INDEX(ClientId, CurrentVal)
adviserfci:  INDEX(ClientId)

相关问题