MySQL 无法运行查询时间限制
Posted
技术标签:
【中文标题】MySQL 无法运行查询时间限制【英文标题】:MySQL cannot run query for time restriction 【发布时间】:2021-08-02 02:03:49 【问题描述】:我在我的网站上运行了一个 mysql 查询,类似于:
SELECT
[random columns]
FROM
DB_Name
WHERE
EndDate > unix_timestamp(now())
AND StartDate <= UTC_DATE()
在我的数据库中,EndDate 是纪元日期,而 StartDate 是 YYYY-MM-DD 格式的日期。
运行这个查询完全没问题,它可以在 0.1 秒内运行。 WHERE
子句显示已经开始但将在未来结束的行。
我的网站有一个部分专门显示在接下来的 24 小时内结束的行。所以我将EndDate
过滤器更改为EndDate <= unix_timestamp(now() + interval 1 day) AND StartDate <= UTC_DATE()
,但这会使查询需要几分钟时间。
将SELECT COUNT(*) FROM DB_Name WHERE EndDate
过滤器运行为EndDate <= unix_timestamp(now() + interval 1 day)
返回约400K 行。相比之下,WHERE EndDate > unix_timestamp(now() + interval 1 day)
只有 3K 行
有没有更快的方法来进行这种比较,而不需要花费几分钟来完成?
【问题讨论】:
EndDate
是什么数据类型?如果是Date
(而不是INT
),为什么要将它与UNIX_TIMESTAMP()
的结果进行比较?
EndDate
的类型为 INT(11)
然而StartDate
的类型是Date
?为什么要混合?
将EndDate
设为Date
类型会有很大不同吗?
你可能需要 unix_timestamp(utc_timestamp()),而不是现在;现在使用客户端设置的时区
【参考方案1】:
我认为你需要这个 SQL,如果你需要在 1 天后进一步严格结束过滤:
SELECT
[random columns]
FROM
DB_Name
WHERE
EndDate > unix_timestamp(now())
AND EndDate <= unix_timestamp(now() + interval 1 day)
AND StartDate <= UTC_DATE()
【讨论】:
呃,忘了我还得保留EndDate > unix_timestamp(now())
过滤器。谢谢。以上是关于MySQL 无法运行查询时间限制的主要内容,如果未能解决你的问题,请参考以下文章