Slow MySQL SELECT MAX(ID) with where is not 语句

Slow MySQL SELECT MAX(ID) with where is not statement

我有 2 个 tables。

第一个 table 用于我的对象(~1,000 行)。

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

第二个 table 用于对象事件(~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...

当我使用此查询时,从 tables:

加载数据大约需要 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" 时,它运行得非常快。任何人都知道解决这个问题以提高速度的方法吗?

所以这有效:

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

它应该相当快。如果您还想 select 最近事件的另一个字段,那么您需要查看 greatest-n-per-group 标签。

Fiddle: http://rextester.com/XWLWYS80827