1. "SELECT id, name FROM Customers WHERE id = id1 OR id = id2"
2. "SELECT id, name FROM Customers WHERE id = id1"
,再来一次,"SELECT id, name FROM Customers WHERE id = id2"
在MySQL的上下文中,以上两种情况是否需要花费相同的时间?或如何在内部实现?
编辑:
假设Customers
表在id
列上建立索引
答案 0 :(得分:1)
您应该这样表达:
SELECT id, name
FROM Customers
WHERE id IN (@id1, @id2);
假设id1
和id2
被传递到查询中,那么只有在id
上有索引时,它们才会相似(这是合理的)。当然,运行两个查询会导致运行两个查询的开销。但是,从算法分析的角度来看,复杂度是相同的。
没有索引,两次查询的版本会慢两倍,因为它需要扫描表两次。但是,尽管速度较慢,但不会影响复杂度。
答案 1 :(得分:1)
简单选择的
90%是开销(网络,解析,优化等)。
id = 123 OR id = 345
已优化为id IN (123, 345)
。如果id
上有一个索引(PRIMARY KEY
是一个索引),则这是对该表的2个探测。
因此,如果获取一行是100%的工作量,则获取2行大约是该工作量的110%(90%的开销,然后是2个实际工作单元)。
与此同时,两个单独选择项将是200%。
另一方面,如果有
WHERE x = 98 OR y = 65
没有好的索引方法。
计划A:全表扫描,检查每一行的x和y。大桌子真的很慢。
方案B:将其更改为
( SELECT ... WHERE x = 98 )
UNION
( SELECT ... WHERE y = 65 )
这将更像是200%。也就是说,在这种情况下,进行两个查询 helps 。
计划C是“索引合并并集”,优化器偶尔会使用它。