用于查找连接表行计数的SQL查询,作为每行的摘要

时间:2013-11-25 10:29:34

标签: mysql sql performance postgresql join

我有一个小工具表,看起来像:

id (integer)
referrer (varchar(255))
width (integer)
height (integer)

......和其他一些人。

我还有一个事件表,如下所示:

id (integer)
widgetid (integer)
eventtype (string)
created_at (datetime)

......和其他一些人。

我希望得到一个数据样本表,为每个小部件找到有关自身和某些事件类型的相关事件的详细信息(一次用于事件类型A,B和C,一次仅用于事件类型A) )。

我需要使用非特定于供应商的(即ANSI SQL),它需要在 PostgreSQL 以及 MySQL 上工作。

我正在尝试类似于此的东西,但它很慢:

SELECT w.id, w.referrer, w.width, w.height, COUNT(e.widgetid), COUNT(f.widgetid)
FROM widgets w
JOIN events e on (e.widgetid = w.id AND e.eventtype = 'A')
JOIN events f on (f.widgetid = w.id AND f.eventtype IN ('A','B','C'))
GROUP BY w.id;

但它非常缓慢(自然)。 e.widgetid,e.eventtype和w.id。

上有索引

我是否构建了这个权利,我怎样才能更快地做到这一点(当然,无论如何都要对widgetid进行索引)?

我想过做子查询,但是不知道每一行的小部件ID(是否有一个函数?)我还没有走得太远。

我也不完全确定我应该使用哪种JOIN。我认为(但如果我错了,请纠正我)LEFT或INNER JOIN适合这一点。

干杯

1 个答案:

答案 0 :(得分:1)

你的JOIN很慢,因为你没有索引,或者你有索引,但没有你正在加入的值。

为id,widgetid和eventtype添加一个索引,我向你保证它会显着提高速度。