慢速MySQL SELECT MAX(ID)和where is not语句

慢速MySQL SELECT MAX(ID)和where is not语句,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我有两张桌子 第一个表是我的对象~1000行 Table Name: object ID | name 1 | Dummy object 1 2 | Dummy object 2 3 | Dummy object 3 ... 724 | Dummy object 724 ... etc. 第二个表用于对象事件~200000行 Table Name: events ID | ID_OBJ | ID_MES | description | timestamp 1 | 3

我有两张桌子

第一个表是我的对象~1000行

Table Name: object
ID  | name
1   | Dummy object 1
2   | Dummy object 2
3   | Dummy object 3
...
724 | Dummy object 724
...
etc.
第二个表用于对象事件~200000行

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为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
它应该相当快。如果您还想选择最近事件的另一个字段,那么您需要查看最大n-per-group标记


Fiddle:

等等,MAXID的用途是什么?你不能把它和任何东西相比。你就不能在e.ID\u OBJ=o.ID和e.ID\u MES上写字吗!=3071?MAXID用于按最高ID选择最新事件。请查看此答案:抱歉,但我找不到有用的答案…:/通过尝试其他方法,它不会通过不包含ID_MES 3071来返回me object latest事件……在这种情况下,您的查询可以完美地工作,但这不是最快的方式。找到了一种更快的方法。您的查询响应时间:总计792,查询耗时0.1146秒。。我的新查询:总计792,查询耗时0.0068秒。查询:选择o.ID,o.name e.timestamp作为对象中的最后一个事件作为o左连接选择MAXID ID,ID\u OBJ作为事件组中的事件按ID\u OBJ作为e上的e.ID\u OBJ=OBJ.ID左连接事件上的事件。ID=e.ID和events.ID\u MES!=按obj.ID划分的3071组;不过还是要谢谢你,伙计!:很酷,你找到了一个更快的查询,但不知怎么的,它没有为我编译。修复了我的查询:选择o.ID,o.name,events.timestamp作为对象中的最后一个事件作为o LEFT JOIN选择MAXID ID,ID\u OBJ作为事件组中的ID\u OBJ作为e上的e.ID\u OBJ=o.ID左连接事件作为事件。ID=e.ID=e.ID和events.ID\u MES!=按o.ID分为3071组;我从这个查询中得到了不同的结果,它似乎找不到ID为的旧事件!=这辆有多快?选择o.ID、o.name、events.timestamp作为对象中的最后一个事件作为o LEFT JOIN从事件中选择MAXID ID、ID\u OBJ,其中ID\u MES!=3071按ID_OBJ分组为e.ID_OBJ=o.ID在events.ID=e.ID按o.ID分组;