【发布时间】:2013-11-25 10:29:34
【问题描述】:
我有一个小部件表,如下所示:
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 适合于此。
干杯
【问题讨论】:
-
是 MySQL 还是 PostgreSQL,请删除其中一个
-
它需要同时在 MySQL 和 PostgreSQL 上工作。
-
既然您使用的是 JOIN,您能告诉我们您有哪些索引(如果有的话)吗?
-
1) 这是您使用的实际查询吗?如果
GROUP BY子句中没有那些w.referrer, w.width, w.height列,它应该无法执行... 2) 您是否需要在一个查询中使用所有这些信息? 3) 你绝对需要events.widgetid和events.eventtype4 的索引) 无论如何都要使用LEFT join。 -
他的 SQL 是伪的,它可以(可能)在 MySQL 上运行,但肯定不能在 PostgreSQL 上运行
标签: mysql sql performance postgresql join