MySQL仅加入最新事件,当表超过16条记录时

时间:2017-01-18 20:31:42

标签: mysql sql greatest-n-per-group

我的数据库中有一个服务器列表,以及一个服务器事件表。我想查询服务器以及它们上次重新启动的时间。

SELECT
  s.server_name,
  e.event_message,
  e.timestamp as last_restart
FROM servers s
LEFT JOIN events e ON e.id=(
  SELECT e.id
  FROM events e
  WHERE
    (e.`server_id`=s.id) AND
    (e.`event-type`='restart')
  ORDER BY e.timestamp
  LIMIT 1
);

查询有效,但当服务器大于18时,它很慢:

  • 16台服务器:查询需要< 0.1s
  • 17台服务器:查询需要~0.5秒
  • 18台服务器:查询需要> 1.0s

这些数字似乎与事件表的大小成比例增长。如果我将表格中的服务器删除回16,则查询速度会再次快。

问题

  1. 事件具有事件类型的索引,server_id上的索引,时间戳的索引,ID上的索引以及server_id和event_type上的复合索引。服务器有一个id索引。是否需要不同/更多的索引?
  2. MySQL(v5.6.x)似乎正在改变查询的执行方式,具体取决于服务器表中的行数。这个神奇的限制是什么?有没有办法强制执行更快的工作?
  3. 是否有更好的方法来构建此查询?
  4. 注意:

    1. 服务器在同一时间戳可能有多个事件,因此仅按时间戳加入并不是唯一的。
    2. 我无法更新MySQL。

0 个答案:

没有答案