慢速MySQL SELECT MAX(ID),其中where语句不是

时间:2017-01-28 16:33:39

标签: mysql greatest-n-per-group

我有2张桌子。

第一张表是我的对象(~1,000行)。

Table Name: object
ID  | name
1   | Dummy object 1
2   | Dummy object 2
3   | Dummy object 3
...
724 | Dummy object 724
...
etc.

第二个表用于对象事件(~200,000行)

Table Name: events
ID | ID_OBJ | ID_MES | description  | timestamp
1  | 3      | 3071   | Test event   | 2017-01-28 12:00:01
2  | 4      | 3001   | Doors opened | 2017-01-28 13:00:04
3  | 3      | 3002   | Doors closed | 2017-01-28 13:33:45
...
etc...

当我使用此查询时,从表中加载数据大约需要10秒钟:

SELECT
  o.ID, o.name, e.timestamp AS last_event
FROM
  object AS o
LEFT JOIN
  events AS e
ON
  e.ID_OBJ = o.ID
AND
  (SELECT MAX(ID) FROM events WHERE events.ID_OBJ = o.ID AND ID_MES != 3071)
GROUP BY
  o.ID

我需要获取我的对象列表,包括上次活动的时间戳,但我不需要包含ID_MES 3071的活动。

当我删除" AND ID_MES!= 3071"从我的查询,它的工作非常快。有人知道这个问题的解决方案来提高速度吗?

1 个答案:

答案 0 :(得分:1)

这样可行:

SELECT o.ID, o.name, MAX(e.timestamp) AS last_event
FROM
  object o
LEFT JOIN
  events e
ON
  e.ID_OBJ = o.ID AND e.ID_MES != 3071
GROUP BY
  o.ID

它应该相当快。如果您还想选择最近事件的另一个字段,那么您需要查看最大n组/标记。

小提琴:http://rextester.com/XWLWYS80827