MYSQL:如何在不查询整个表的情况下获取最后X小时插入的行
假设我有一个包含100万行的表,并且在过去的2小时内只添加了5行(每天的行数不同每小时添加)。MYSQL:如何在不查询整个表的情况下获取最后X小时插入的行
我希望能够获得在过去2小时内添加的行,例如。什么是我可以用来获得最佳性能的最佳查询/实现。
我打算避免查询整个100万张桌子,并且每2小时比较一次日期......还有更好的方法吗?
谢谢。
下表考虑有超过一百万行:
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行找到结果组。正如你所看到的,索引很重要。
(“5”是'近似值,但比“1053588”好很多)。 –
给@ Eric的评论/问题提一个更好的观点:告诉我们你的模式。
但是简单的答案是,没有涉及查询日志和数据库服务器的其他“带外”逻辑的诡计,不太可能。
然而,这样的想法完全错过了关系数据库管理系统(RDBMS)的观点。针对“整个”表运行查询是SQL的重点。与此相对应,只要您有一个正确指定的模式,以一种表现性的方式运行带有限制性WHERE子句的SELECT是RDBMS比一个文本文件更主要的增值之一。
SELECT * FROM mytable WHERE last_update > NOW() - INTERVAL 2 HOUR;
提供了一个列像last_update
存在,具有正确的数据类型和索引,该查询将运行非常快。一百万行排序?不是件事。十亿行排序?没问题。我经常在亿行表上运行这样的查询,并在中级桌面硬件上获得亚秒级的结果。
这个速度的关键?适当的模式,适当的规范化和适当的索引使用。
谢谢你的解释。 – Shushi
行如何看起来像?你有增量ID吗?时间戳创建?任何索引? – Eric
在你想要过滤的列上使用索引 – scaisEdge
请阅读此:http://meta.stackoverflow.com/a/271056/然后[编辑]你的问题,如果你想要的是不是纯粹的猜测ansers。 –