如何在 Mysql 中加快日期时间的查询
How to speed up query for datetime in Mysql
SELECT *
FROM LOGS
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)
我有一个很大的 table 日志 (InnoDB)。当我尝试获取上个月的数据时,查询等待时间过长。
我为日期时间列创建了一个索引,但它似乎没有帮助。如何加快此查询?
可能您唯一能做的就是在 datetime
上创建聚簇索引。这将确保值位于同一位置。
但是,我认为这不会解决您的实际问题。你为什么要带回 all 个月的记录。这是很多数据。
很有可能,您可以汇总数据库中的数据,然后只带回您需要的信息,而不是所有数据.
由于数据库记录是按从旧到新的顺序插入的,因此您可以创建 2 个调用。请求最早记录 ID 的第一个调用:
int oldestRecordID = SELECT TOP 1 MIN(id)
FROM LOGS
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)
然后使用该 ID 请求 ID > oldestRecordID:
的所有记录
SELECT *
FROM LOGS
WHERE ID > oldestRecordID
这是多个调用,但它可能会更快,但我相信您也可以将这 2 个调用结合起来。
SELECT *
FROM LOGS
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)
我有一个很大的 table 日志 (InnoDB)。当我尝试获取上个月的数据时,查询等待时间过长。
我为日期时间列创建了一个索引,但它似乎没有帮助。如何加快此查询?
可能您唯一能做的就是在 datetime
上创建聚簇索引。这将确保值位于同一位置。
但是,我认为这不会解决您的实际问题。你为什么要带回 all 个月的记录。这是很多数据。
很有可能,您可以汇总数据库中的数据,然后只带回您需要的信息,而不是所有数据.
由于数据库记录是按从旧到新的顺序插入的,因此您可以创建 2 个调用。请求最早记录 ID 的第一个调用:
int oldestRecordID = SELECT TOP 1 MIN(id)
FROM LOGS
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)
然后使用该 ID 请求 ID > oldestRecordID:
的所有记录SELECT *
FROM LOGS
WHERE ID > oldestRecordID
这是多个调用,但它可能会更快,但我相信您也可以将这 2 个调用结合起来。