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