带有左连接的MySQL查询,按极慢的

时间:2015-09-02 02:06:13

标签: mysql sql phpmyadmin

我有以下查询,大约需要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

为了便于阅读,我稍微简化了该应用程序中使用的查询,但我一直在使用这个简化的查询进行测试,问题仍然存在。所以问题出在这一部分。

表页:约3K记录。表访问者:约300K记录。

我做了什么:

  • 我在visitor.page_id上​​有索引(外部键链接到pages.id)。
  • 显然我的ID字段被设置为主键。

我尝试过:

  • 我已将read_buffer_size,sort_buffer_size,read_rnd_buffer_size增加到64M。
  • 排序的EXPLAIN查询(15秒): enter image description here
  • EXPLAIN查询没有排序(3秒,仍然很长,这不是我想要的输出): enter image description here
  • 删除SUM和Count计算,它们对执行时间没有影响。

改善此查询的任何想法?

1 个答案:

答案 0 :(得分:1)

首先,试试 我的第一个建议是在加入之前进行聚合:

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;

但是,您的查询需要同时执行聚合和排序 - 并且您没有过滤。我不确定你是否能够更快地获得它。