2

我有一个日志表,如下所示:

logs (_id_, client, metric, value);

我正在尝试从 PHP 前端在 MySQL 中编写以下查询,以从日志表中获取信息。

SELECT client, LAST(value) AS value
FROM logs 
WHERE metric = 'free space'
GROUP BY client;

当然,除非那LAST不是一个有效的聚合函数。

我提出的解决方案是这样的:

SELECT client, value 
FROM logs 
WHERE id IN (
   SELECT MAX(id) 
   FROM logs 
   WHERE metric = 'free space' 
   GROUP BY client);

但是,对于一个 4,000 行的非常小的表,在我的开发机器上执行这个查询需要超过 60 秒。

建议?

4

2 回答 2

3

你应该通过加入来做到这一点

SELECT l.client, l.value 
  FROM logs l
  JOIN ( SELECT client, MAX(id) as id
           FROM logs 
          WHERE metric = 'free space' 
          GROUP BY client ) s
    ON l.id = s.id

您还应该id为外部查询创建一个(如果可能的话是唯一的)索引,这使连接能够使用索引。如果优化非常重要,您可能还需要一个索引client, id,或者可能id, client,对于子选择,尽管这并不像您必须扫描整个表那么重要。

另请参阅SQL JOIN 与 IN 性能?IN 与 JOIN 与大行集讨论使用inor join

于 2012-04-22T12:25:41.477 回答
1

此查询在执行 group by 操作后提供最新的行。还显示了另一个表的连接。

选择消息。* , users. 作为用户ID id,。 , . FROM 消息 LEFT JOIN ON 。= 。 WHERE messages.id IN (SELECT MAX(messages.id) FROM messages WHERE messages.receiver_id = 2 GROUP BY messages.sender_id);usersfirst_nameuserslast_nameusersusersidmessagessender_id

于 2012-11-15T06:06:14.403 回答