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 &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()),而不是现在;现在使用客户端设置的时区 【参考方案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()) 过滤器。谢谢。

以上是关于MySQL 无法运行查询时间限制的主要内容,如果未能解决你的问题,请参考以下文章

无法在 MySQL 语法错误中运行查询意外

高性能mysql 第6章 查询性能优化

无法运行查询给出 mySQL 错误 #1093 - 您无法在 FROM 子句中指定目标表“成员”进行更新 [重复]

由于 mysql 将字符串视为列名,因此无法运行查询

MySQL无法在错误的表上运行任何SQL查询

Laravel 4 无法运行整个 RAW 查询