2012-05-19 124 views
0

我的数据集是一个包含3行的表:硬盘的ID,空白空间的百分比,时间戳。该表每20分钟附加一个每个HDD的新状态(1200个)。MySQL:根据时间戳间隔选择数据

如果我想选择我的硬盘池的最后一个状态,我需要MAX(时间戳)和MIN(时间戳),如果我想要最老的。

但是说我有一个给定的时间戳,我怎么能要求MySQL从这个时间戳的大约X秒钟内检索数据?

回答

1
WHERE yourTimeStamp 
    between TIMESTAMPADD(SECOND,-3,yourtimestamp) 
     and TIMESTAMPADD(SECOND, 3,yourtimestamp) 

其中-3和+ 3代替X

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestampadd获取更多帮助。

+0

它的工作原理!但速度很慢。有关如何加快此任务的任何想法? – Cystack

+0

我需要看到连接有可能有一种方法来计算timestampadd ONCE并将其用于每条记录而不是每条记录。我也得看看你是如何得到“MAX”等几件事的。您使用的SQL以及执行计划将有助于确定瓶颈的位置以及解决性能问题。 – xQbert

1

像这样:

WHERE timestamp BETWEEN DATE_SUB('<given_timestamp>', INTERVAL 5 SECOND) 
    AND DATE_ADD('<given_timestamp>', INTERVAL 5 SECOND); 

正如在其他答复中提到,当选择是基于timestamp现场查询速度很慢。

您可以在该列中添加INDEX加快步伐:

ALTER TABLE <table_name> ADD INDEX(`timestamp`) 

需要注意的是,根据您的表的大小,你第一次添加需要一段时间的索引。其次,它会减慢INSERT查询并增加数据库的大小。这对每个人都是不同的,所以你只能通过测试找出答案。

+0

它给出了语法错误:/ – Cystack

+0

@Cystack对不起,你是对的。修正了......顺便说一句,为了加快基于你的时间戳记字段的查询,你必须在该列上添加一个索引 –

+0

它已经被编入索引,它只需要大约16秒,我认为这是相当长的:/你的代码现在工作尽管;)和其他一样快(或慢)!谢谢 – Cystack