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

标签 mysql performance

假设我有一个包含 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/

相关文章:

mysql - PostgreSQL:从 MySQL 转储导入数据库 - 语法错误

mysql - 加快MYSQL中的自连接

mysql - 缩短或丢弃 JOIN 到我们不从中提取数据的中间表

c++ - 如果内部的总工作相同,将 for 循环拆分为多个 for 循环的开销是多少?

php - Cakephp IN 条件绕过重复 ID 来获取数据

php - 为什么 Mysql order by 不适用于此查询

MySQL:将列从一个表快速复制到另一个表

c# - 图像大小调整性能 : System. 绘图与 System.Windows.Media

c# - 使用 Linq 搜索

.net - 文本框的值消失 - 将 View 模型绑定(bind)到选项卡(内容控件)