【问题标题】:MySQL cannot run query for time restrictionMySQL 无法运行查询时间限制
【发布时间】: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 &lt;= unix_timestamp(now() + interval 1 day) AND StartDate &lt;= UTC_DATE(),但这会使查询需要几分钟时间。

SELECT COUNT(*) FROM DB_Name WHERE EndDate 过滤器运行为EndDate &lt;= unix_timestamp(now() + interval 1 day) 返回约400K 行。相比之下,WHERE EndDate &gt; 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


【解决方案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 &gt; unix_timestamp(now()) 过滤器。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多