我有一个小工具表,看起来像:
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适合这一点。
干杯
答案 0 :(得分:1)
你的JOIN很慢,因为你没有索引,或者你有索引,但没有你正在加入的值。
为id,widgetid和eventtype添加一个索引,我向你保证它会显着提高速度。