gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:52:39 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com