检索每个“参数”在表中插入的最后一行

时间:2014-12-10 12:01:42

标签: mysql select

我有一张表,目前大约有1.3万行,它存储了几个不同参数的测量数据点。这是一个约30个参数。

表:

* id
* station_id (int)
* comp_id (int)
* unit_id (int)
* p_id (int)
* timestamp
* value

我有一个独特的索引:(station_id, comp_id, unit_id, p_id, timestamp)

由于每个参数的时间戳不同,我很难按时间戳排序(我必须使用分组)。

所以今天我通过这个查询选择每个参数的最后一个值:

select p_id, timestamp, value
from (select p_id, timestamp, value
      from table
      where station_id = 3 and comp_id = 9112 and unit_id =  1 and
            p_id in (1,2,3,4,5,6,7,8,9,10)
      order by timestamp desc
     ) table_x
group by p_id;

此查询大约需要3秒钟才能执行。 即使我有优先级使用filesort来查找值之前提到的索引。

仅查询1个特定参数:

select p_id, timestamp, value from table where station_id = 3 and comp_id = 9112 and unit_id =  1 and p_id =1 order by timestamp desc limit 1;

不花时间(0.00)。

我也尝试将参数-id加入到一个表中,我将参数ID存储起来,但没有运气。

那么,是否有一种简单(和快速)的方式来询问具有不同参数的几行的最新值? 执行一个循环请求每个参数的循环程序看起来比一次性问一次我认为不是使用数据库的方法要快得多。

1 个答案:

答案 0 :(得分:1)

您的查询不正确。您按p_id汇总,但包括其他列。这些来自不确定的行,documentation非常明确:

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   未在GROUP BY子句中命名的非聚合列。这意味着   前面的查询在MySQL中是合法的。您可以使用此功能   通过避免不必要的列排序来获得更好的性能   分组。但是,这主要适用于每个中的所有值   GROUP BY中未命名的非聚合列对于每个列都是相同的   组。服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的。   此外,不能从每个组中选择值   受添加ORDER BY子句的影响。

以下内容应该有效:

select p_id, timestamp, value
from table t join
     (select p_id, max(timestamp) as maxts
      from table
      where station_id = 3 and comp_id = 9112 and unit_id =  1 and
            p_id in (1,2,3,4,5,6,7,8,9,10)
      order by timestamp desc
     ) tt
     on tt.pid = t.pid and tt.timestamp = t.maxts;

此查询的最佳索引是table(station_id, comp_id, unit_id, p_id, timestamp)上的综合索引。