MYSQL:如何在最后X小时内插入行而不查询整个表

时间:2017-10-19 18:59:13

标签: mysql performance

假设我有一个包含100万行的表,在过去的2小时内只添加了5行(每天每小时添加不同的行数)。

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

我试图避免查询整个100万个表格并每2小时比较一次日期......有更好的方法吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

更好地了解@ Eric的评论/问题:向我们展示您的架构。

但简短的回答是,没有涉及查询日志和其他“带外”逻辑与数据库服务器的技巧,不太可能。

然而,这样的思考完全忽略了关系数据库管理系统(RDBMS)的观点。 SQL是关于“整个”表运行查询的。与此一致,只要您具有正确指定的模式,以高性能方式运行具有限制性WHERE子句的SELECT是RDBMS在文本文件上的主要增值之一。

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

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

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

答案 1 :(得分:1)

考虑下表超过一百万行:

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行来查找结果集。正如您所看到的那样,索引非常重要。