MYSQL:如何在不查询整个表的情况下获取最后X小时插入的行

问题描述:

假设我有一个包含100万行的表,并且在过去的2小时内只添加了5行(每天的行数不同每小时添加)。MYSQL:如何在不查询整个表的情况下获取最后X小时插入的行

我希望能够获得在过去2小时内添加的行,例如。什么是我可以用来获得最佳性能的最佳查询/实现。

我打算避免查询整个100万张桌子,并且每2小时比较一次日期......还有更好的方法吗?

谢谢。

+1

行如何看起来像?你有增量ID吗?时间戳创建?任何索引? – Eric

+1

在你想要过滤的列上使用索引 – scaisEdge

+0

请阅读此:http://meta.*.com/a/271056/然后[编辑]你的问题,如果你想要的是不是纯粹的猜测ansers。 –

下表考虑有超过一百万行:

CREATE TABLE `event` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`data` varchar(11) DEFAULT NULL, 
`occured_on` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
PRIMARY KEY (`id`), 
) ENGINE=InnoDB AUTO_INCREMENT=1058669 DEFAULT CHARSET=utf8; 

注:没有对occured_on场没有索引。

要获得插在最后2小时的行,你可以这样写:

SELECT * FROM `event` WHERE `occured_on` > NOW() - INTERVAL 2 HOUR; 

但是,如果你个人资料的查询,

EXPLAIN SELECT * FROM `event` WHERE occured_on > NOW() - INTERVAL 2 HOUR; 

,你会得到这样的事情(取决于你数据):

id select_type TABLE TYPE possible_keys KEY  key_len ref  ROWS Extra 
1 SIMPLE  event ALL  NULL   NULL NULL NULL 1053588 USING where 

这基本上意味着全表扫描(ROWS条目告诉我们MySQL有多少行看看找到结果集)。 现在,如果你添加索引并运行相同的解释查询,

ALTER TABLE `event` ADD INDEX (`occured_on`); 
EXPLAIN SELECT * FROM `event` WHERE occured_on > NOW() - INTERVAL 2 HOUR; 

你会看到(取决于数据):

id select_type TABLE TYPE possible_keys KEY   key_len ref  ROWS Extra 
1 SIMPLE  event RANGE occured_on  occured_on 6  NULL 5  USING INDEX condition 

这意味着MySQL只看着5行找到结果组。正如你所看到的,索引很重要。

+0

(“5”是'近似值,但比“1053588”好很多)。 –

给@ Eric的评论/问题提一个更好的观点:告诉我们你的模式。

但是简单的答案是,没有涉及查询日志和数据库服务器的其他“带外”逻辑的诡计,不太可能。

然而,这样的想法完全错过了关系数据库管理系统(RDBMS)的观点。针对“整个”表运行查询是SQL的重点。与此相对应,只要您有一个正确指定的模式,以一种表现性的方式运行带有限制性WHERE子句的SELECT是RDBMS比一个文本文件更主要的增值之一。

SELECT * FROM mytable WHERE last_update > NOW() - INTERVAL 2 HOUR; 

提供了一个列像last_update存在,具有正确的数据类型和索引,该查询将运行非常快。一百万行排序?不是件事。十亿行排序?没问题。我经常在亿行表上运行这样的查询,并在中级桌面硬件上获得亚秒级的结果。

这个速度的关键?适当的模式,适当的规范化和适当的索引使用。

+0

谢谢你的解释。 – Shushi