【问题标题】:MySQL query with two boolean conditions takes way longer than querying each condition separat具有两个布尔条件的 MySQL 查询比查询每个条件分隔花费的时间更长
【发布时间】:2016-06-05 01:11:40
【问题描述】:

我有一个 MySQL 数据库,其中包含大约 160.000 个条目的表。当我查询以下查询时,大约需要 0.5 秒的执行时间:

SELECT * FROM table WHERE EXTRACT(HOUR FROM date) > 18;
SELECT * FROM table WHERE EXTRACT(HOUR FROM date) < 3;

像这样将语句组合成一个查询

SELECT * FROM table WHERE EXTRACT(HOUR FROM date) > 18 OR EXTRACT(HOUR FROM date) < 3; 

执行需要很长时间。事实上,我还没有看到查询完成执行并在大约 20 分钟后取消它。

当我将 OR 更改为 AND 时,例如:

SELECT * FROM table WHERE EXTRACT(HOUR FROM date) > 10 AND EXTRACT(HOUR FROM date) < 19; 

执行时间再次以毫秒为单位。

谁能解释一下这个奇怪的行为,也许可以提出一个用 OR 查询这两个条件的解决方案。

提前谢谢你

【问题讨论】:

    标签: mysql sql conditional-statements execution-time


    【解决方案1】:

    像你这样的查询的性能不可能是最优的:你在日期列上使用了一个函数,即使日期列被索引了,也不能使用索引。

    作为一个简单的解决方法,我会尝试使用 union all 查询:

    SELECT * FROM table WHERE EXTRACT(HOUR FROM date) > 18
    UNION ALL
    SELECT * FROM table WHERE EXTRACT(HOUR FROM date) < 3
    

    虽然在逻辑上等同于 OR 形式,但它的性能可能会更好......但也可能不会!

    适当的解决方案是添加一个新的小时列,并在其上添加一个索引

    ALTER TABLE table ADD COLUMN date_hour INT;
    ALTER TABLE table ADD INDEX idx_date (date_hour);
    
    /* do an update once... or use a trigger */
    UPDATE table SET date_hour = EXTRACT(HOUR FROM date);
    
    SELECT * FROM table WHERE date_hour > 18 or date_hour < 3;
    

    【讨论】:

      【解决方案2】:

      这对你有用

      SELECT * FROM table WHERE EXTRACT(HOUR FROM date) not between 3 and 18;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多