首页 > 解决方案 > 如何优化 MySQL 慢查询

问题描述

我有以下 MySQL 查询,执行需要很长时间:

SELECT `market`.`name` AS `Markets`, count(*) * `clicks`.`cost` AS `Rev`
FROM `clicks`
INNER JOIN markets ON `clicks`.`market_id`= `markets`.`id`
WHERE clicks.created_date = `date1`
GROUP BY `markets`.`id`
ORDER BY `Rev` DESC

最初它非常慢,但后来我删除了多余的日期功能。仍然需要很长时间才能执行。有什么解决办法吗?

查询说明:我从一个表中选择市场名称,行数乘以另一个表中的成本。市场的 ID 在第一个表“点击”中定义,我从“市场”表中获取市场名称。此外,我通过市场 ID 对市场进行分组,并通过 Rev 降序排序

标签: mysqlsqlgroup-by

解决方案


您的查询正在滥用 MySQL部分按功能分组。您按市场分组,但有一个clicks.cost不包含在聚合中的杂散列。无论您的查询速度有多快,您都会得到不正确的结果。

您可以按如下方式修改您的查询:

SELECT market.name AS Markets, subqry.Rev FROM (
    SELECT market_id, SUM(cost) AS Rev
    FROM clicks
    WHERE created_date = 'some date'
    GROUP BY market_id
) AS subqry
INNER JOIN markets ON subqry.market_id = markets.id
ORDER BY Rev DESC

确定结果正确后,创建以下索引:

CREATE INDEX ix_clicks ON clicks (created_date, market_id, cost)

推荐阅读