【发布时间】: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()),而不是现在;现在使用客户端设置的时区
标签: php mysql sql performance