MySQL'OR'和两个SELECT语句是否具有相同的复杂性?

时间:2019-04-29 11:32:21

标签: mysql sql performance

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列上建立索引

2 个答案:

答案 0 :(得分:1)

您应该这样表达:

SELECT id, name
FROM Customers
WHERE id IN (@id1, @id2);

假设id1id2被传递到查询中,那么只有在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是“索引合并并集”,优化器偶尔会使用它。