假设我有一个包含 100 万行的表,并且在过去 2 小时内仅添加了 5 行(每天每小时添加的行数不同)。
例如,我希望能够获取过去 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;
注意:occurred_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 行来查找结果集。正如您所看到的,索引非常重要。
关于MYSQL:如何在不查询整个表的情况下获取过去X小时内插入的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46837000/