MySQL 左连接查询,分组依据和排序依据极慢
MySQL Query with left join, group by and order by extremely slow
我有以下查询,执行大约需要 15 秒。如果我删除 ORDER BY,需要 3 秒,这仍然太长了。
SELECT
pages.id AS id,
pages.page_title AS name,
SUM(visitors.bounce) AS bounce,
SUM(visitors.goal) AS goal,
count(visitors.id) AS volume
FROM
pages
LEFT JOIN visitors ON pages.id = visitors.page_id
GROUP BY pages.id
ORDER BY volume DESC
为了可读性,我从应用程序中使用的查询稍微简化了这个查询,但我一直在测试这个简化的查询,问题仍然存在。所以问题出在这部分。
Table 页:大约 3K 条记录。 Table 访客:大约 300K 条记录。
我做了什么:
- 我在 visitors.page_id 上有索引(外键链接到 pages.id)。
- 显然我的 ID 字段设置为主键。
我尝试过的:
- 我已经将read_buffer_size、sort_buffer_size、read_rnd_buffer_size增加到64M。
- 带排序的 EXPLAIN 查询(15 秒):
- 不排序的 EXPLAIN 查询(3 秒,仍然很长,这不是我想要的输出):
- 删除 SUM 和 Count 计算,它们对执行时间没有真正影响。
有什么改进此查询的想法吗?
首先,试试
我的第一个建议是在加入之前进行聚合:
SELECT p.id, p.page_title AS name,
v.bounce, v.goal,v.volume
FROM pages p LEFT JOIN
(SELECT page_id, sum(v.bounce) as bounce, sum(v.goal) as goal,
count(*) as volumn
FROM visitors v
GROUP BY page_id
) v
ON pages.id = v.page_id
ORDER BY volume DESC;
但是,您的查询需要进行聚合和排序,而您没有进行过滤。我不确定您能否更快地获得它。
我有以下查询,执行大约需要 15 秒。如果我删除 ORDER BY,需要 3 秒,这仍然太长了。
SELECT
pages.id AS id,
pages.page_title AS name,
SUM(visitors.bounce) AS bounce,
SUM(visitors.goal) AS goal,
count(visitors.id) AS volume
FROM
pages
LEFT JOIN visitors ON pages.id = visitors.page_id
GROUP BY pages.id
ORDER BY volume DESC
为了可读性,我从应用程序中使用的查询稍微简化了这个查询,但我一直在测试这个简化的查询,问题仍然存在。所以问题出在这部分。
Table 页:大约 3K 条记录。 Table 访客:大约 300K 条记录。
我做了什么:
- 我在 visitors.page_id 上有索引(外键链接到 pages.id)。
- 显然我的 ID 字段设置为主键。
我尝试过的:
- 我已经将read_buffer_size、sort_buffer_size、read_rnd_buffer_size增加到64M。
- 带排序的 EXPLAIN 查询(15 秒):
- 不排序的 EXPLAIN 查询(3 秒,仍然很长,这不是我想要的输出):
- 删除 SUM 和 Count 计算,它们对执行时间没有真正影响。
有什么改进此查询的想法吗?
首先,试试 我的第一个建议是在加入之前进行聚合:
SELECT p.id, p.page_title AS name,
v.bounce, v.goal,v.volume
FROM pages p LEFT JOIN
(SELECT page_id, sum(v.bounce) as bounce, sum(v.goal) as goal,
count(*) as volumn
FROM visitors v
GROUP BY page_id
) v
ON pages.id = v.page_id
ORDER BY volume DESC;
但是,您的查询需要进行聚合和排序,而您没有进行过滤。我不确定您能否更快地获得它。