【发布时间】:2021-05-12 21:40:05
【问题描述】:
如何优化这个查询
WITH stats AS (SELECT a.IntegratorSalesAssociateID,
a.AgentName,
(
SELECT COUNT(*)
FROM properties AS p
WHERE a.IntegratorSalesAssociateID = p.IntegratorSalesAssociateID
AND p.TransactionType = '2'
AND MONTH(p.OrigListingDate) = MONTH(CURRENT_DATE)
AND YEAR(p.OrigListingDate) = YEAR(CURRENT_DATE)
) AS properties_this_month
FROM agents AS a)
SELECT stats.*,
DENSE_RANK() over (ORDER BY stats.properties_this_month DESC) AS 'rank'
from stats
我想如果我加入这两个表并以某种方式将它们分组,它会执行得更好,目前它运行了 17.5 秒,奇怪的是,添加dense_rank 根本不会影响性能。
相关表结构
CREATE TABLE `agents`
(
`IntegratorSalesAssociateID` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,
`AgentName` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
CREATE TABLE `properties`
(
`id` bigint(20) UNSIGNED NOT NULL,
`IntegratorSalesAssociateID` varchar(13) COLLATE utf8mb4_unicode_ci NOT NULL,
`TransactionType` tinyint(4) NOT NULL,
`OrigListingDate` date DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
【问题讨论】:
-
我们对底层表结构、索引、数据或查询计划一无所知。您认为我们可以如何优化此查询?
-
我认为实际的表结构并不重要,我的问题基本上是,如何通过加入表而不使用子查询来达到相同的结果。实际的表格非常大,会占据整个页面
-
AND MONTH(p.OrigListingDate) = MONTH(CURRENT_DATE) AND YEAR(p.OrigListingDate) = YEAR(CURRENT_DATE) 看起来很可疑。我会尝试将其重写为 p.OrigListingDate BETWEEN
AND -
将相关子查询转换为 JOIN。删除 CTE 使用。
-
您可以包含表格的相关部分。
标签: mysql sql mariadb query-optimization mariadb-10.5