MySQL 具有两个布尔条件的查询比单独查询每个条件花费的时间更长

MySQL query with two boolean conditions takes way longer than querying each condition separat

我有一个 MySQL 数据库,其中 table 有大约 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 查询这两个条件的解决方案。

提前致谢

这对你有用

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

像您这样的查询的性能不可能是最佳的:您正在对日期列使用函数,即使对日期列建立了索引,也无法使用索引。

作为一个简单的解决方法,我会尝试使用联合所有查询:

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;