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

标签 mysql sql conditional-statements execution-time

我有一个 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/

相关文章:

php - Magento更新每商店价格查看SQL

sql - PostgreSQL 中的 "null value in column violates not-null constraint"错误

python - 用 X 相邻值的平均值替换 Numpy 数组中大于阈值的所有元素

MySqlHelper 未将查询参数推送到 MySQL

php - 我当前的电影数据库的公平评级

php - 使用MySQL验证的php中的登录表单

sql - sql server 2008 中的计划程序我的做法正确还是存在问题?

plsql - 两个值之间的条件选择

c++ - 奇怪的条件格式

python - bottle_mysql 编码失败