假设我有一个包含100万行的表,在过去的2小时内只添加了5行(每天每小时添加不同的行数)。
我希望能够获得过去2小时内添加的行。什么是我可以用来获得最佳性能的最佳查询/实现。
我试图避免查询整个100万个表格并每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行来查找结果集。正如您所看到的那样,索引非常重要。