显然,在数学中,逻辑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(我个人和大学都使用的)。
我预计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出现了两次。它们是不同的Matt,但UNION
将合并重复的Matt并只报告一个(假设select firstname from table ...
完成)。
正如评论员所提到的,为了获得最佳性能,数据库可能会以不同的方式实现或尝试重写查询。