我有一个从多个表中提取数据的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。
有什么方法可以提高这个查询的性能吗?
2条答案
按热度按时间wtlkbnrh1#
首先,您是否为这些表创建了索引?
如果不知道您的数据结构以及您将在其中放入什么样的查询负载,则很难说,但首先看一下,如果您还没有这些索引,我会说这些索引应该可以提高性能:
表clientlist上的crmcontactid
桌面平面图上的客户ID
通知RFCI上的客户ID(包括incometype和应付账款)
如果您还没有设置表主键,并且从列名来看,它们听起来像是不错的候选键,那么如果这样做有效的话,您可以一举两得。
xoshrz7s2#
折叠测试
d.totalfci IS NOT NULL
到生成它的子查询中,即使它需要在HAVING
条款。添加一些索引