【问题标题】:SQL query to find counts of joined table rows as summary for each rowSQL查询以查找连接表行的计数作为每行的摘要
【发布时间】: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),它需要在 PostgreSQLMySQL 上工作。

我正在尝试类似的方法,但速度很慢:

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.widgetidevents.eventtype4 的索引) 无论如何都要使用LEFT join
  • 他的 SQL 是伪的,它可以(可能)在 MySQL 上运行,但肯定不能在 PostgreSQL 上运行

标签: mysql sql performance postgresql join


【解决方案1】:

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

为 id、widgetid 和 eventtype 添加一个索引,我向您保证它将显示显着的速度提升。

【讨论】:

  • 原来widgetid和eventtype上已经有索引了——但这并没有加快速度——我怀疑使用的特定SQL有问题...
猜你喜欢
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 2011-03-06
  • 2017-07-29
  • 1970-01-01
相关资源
最近更新 更多