显然,在数学中,逻辑AND和OR类似于集合论INTERSECT和UNION。也就是说,如果A和B是集合,那么{x:x IN A OR x IN B} = A UNION B(类似于AND和INTERSECT)。
我的问题如下:这个数学上的等式是否与SQL中的运行时等效性相对应?具有一组OR表达式的单个SQL查询是否花费时间等同于一组彼此联合的SQL查询?更确切地说,是这样的:
SELECT * FROM A
WHERE A.x = a OR A.x = b OR ... OR A.x = z
相当于运行时间吗?
SELECT * FROM A
WHERE A.x = a
UNION
...
UNION
SELECT * FROM A
WHERE A.x = z
如果实施很重要,我会关注MySQL(这是我在工作中使用的)和PostgreSQL(这是我个人和大学时使用的)。
答案 0 :(得分:0)
我预计UNION在理论上会变慢。考虑像这样的数据集:
Firstname Age
--------- ----
John 20
Matt 30
Jess 30
Nate 20
Tor 10
Matt 20 // different Matt
查询select Firstname from table where age in (10,20,30)
可以逐行进行,并提取符合搜索条件的数据。
查询select Firstname .. UNION .. select Firstname .. UNION ..
必须从上到下(假设正在进行表扫描)3次 - 一次为10,20和30.获取数据后,UNION
将删除重复信息。在上面的测试案例中,Matt出现了两次。它们是不同的Matts,但UNION
将合并重复的Matts并仅报告一个(假设select firstname from table ...
已完成)。
正如评论员所提到的,数据库可以实现或尝试以不同方式重写查询以获得最佳性能。