我有一个 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 查询这两个条件的解决方案。
提前致谢
最佳答案
像您这样的查询的性能不可能是最佳的:您在日期列上使用函数,即使为日期列建立了索引,也无法使用索引。
作为一个简单的解决方法,我会尝试使用 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;
关于具有两个 bool 条件的 MySQL 查询比单独查询每个条件花费的时间更长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35573469/