使用SUM()的慢速MySQL查询
我必须在我的代码中运行两个查询来获得租户余额。但是,这些查询太慢 第一个查询,我得到所有租户及其单位名称:使用SUM()的慢速MySQL查询,mysql,query-performance,Mysql,Query Performance,我必须在我的代码中运行两个查询来获得租户余额。但是,这些查询太慢 第一个查询,我得到所有租户及其单位名称: SELECT t.TenantID FROM Tenants t JOIN Units u ON t.UnitID = u.UnitID Where t.Prospect = 2 AND t.PropertyID = 8 ORDER BY CONCAT(Left(Replace(UnitName,'-',''),2), R
SELECT t.TenantID
FROM Tenants t
JOIN Units u
ON t.UnitID = u.UnitID
Where t.Prospect = 2
AND t.PropertyID = 8
ORDER
BY CONCAT(Left(Replace(UnitName,'-',''),2),
REPEAT('0', (10-CHAR_LENGTH(UnitName))),
Right(Replace(UnitName,'-',''),
CHAR_LENGTH(Replace(UnitName,'-',''))-2
) )
它返回500行
然后我得到了4种条件下的余额。此查询将位于第一个查询循环内:
Select
SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) AS TotalDebit,
SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) AS HousingDebit,
SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) AS TotalCredit,
SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) AS HousingCredit
From TenantTransactions
Where TenantID= FirstQuery.TenantID
我是不是做错了?运行大约需要1分钟。使用
分组方式在单个查询中执行此操作
试着这样做:
SELECT t.TenantID, TotalDebit, HousingDebit, TotalCredit, HousingCredit
FROM Tenants t
JOIN Units u ON t.UnitID = u.UnitID
LEFT JOIN (
Select
TenantID,
SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) AS TotalDebit,
SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) AS HousingDebit,
SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) AS TotalCredit,
SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) AS HousingCredit
From TenantTransactions
Group By TenantID
) sums ON sums.TenantID = t.TenantID
Where t.Prospect = 2
AND t.PropertyID = 8
ORDER
BY CONCAT(Left(Replace(UnitName,'-',''),2),REPEAT('0', (10-CHAR_LENGTH(UnitName))),Right(Replace(UnitName,'-',''),CHAR_LENGTH(Replace(UnitName,'-',''))-2))
内部查询可能仍会运行一段时间,但只运行一次
在租户交易
上尝试包含以下列的复合覆盖索引:(租户ID、TransactionTypeID、ChargeTypeID、TransactionMount)
,以优化查询中的金额
在租户
上尝试一个包含(PropertyID,Prospect)
列的复合索引。下面是另一种使用子查询的方法。您知道,性能问题可能不是数据库性能,而是数据库和应用程序服务器之间的来回。因此,这是一个单一的查询将有所帮助
SELECT t.TenantID,
(SELECT SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) From TenantTransactions TT WHERE TT.TenantID=t.TenantID) AS TotalDebit,
(SELECT SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) From TenantTransactions TT WHERE TT.TenantID=t.TenantID) AS HousingDebit,
(SELECT SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) From TenantTransactions TT WHERE TT.TenantID=t.TenantID) AS TotalCredit,
(SELECT SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) From TenantTransactions TT WHERE TT.TenantID=t.TenantID) AS HousingCredit
FROM Tenants t
JOIN Units u
ON t.UnitID = u.UnitID
Where t.Prospect = 2
AND t.PropertyID = 8
ORDER
BY CONCAT(Left(Replace(UnitName,'-',''),2),REPEAT('0', (10-CHAR_LENGTH(UnitName))),Right(Replace(UnitName,'-',''),CHAR_LENGTH(Replace(UnitName,'-',''))-2))
你给你的表编索引了吗?查询中的函数调用太多。这绝对是反应迟钝的原因。但是,要有一个更好的。在解决方案中,您需要指定表结构、索引和键是的,租户和租户事务表由租户TID链接。TenantID是租户PK,租户交易FK请阅读此内容。请特别注意有关查询性能的部分。请您的问题提供我们需要的基本信息。谢谢您。。。它跑得很快。由于某些原因,某些余额返回的值与我的慢速查询不同。您是否找到导致数据差异的原因?是的,抱歉。你的问题很完美。我改变了一个条件。谢谢,里面有多余的逗号。现在已经修复了。谢谢,但是它仍然返回语法错误,因为结尾在案例中。我正在使用MySQL