首页 > 解决方案 > SQL 中“>ALL”VS“MAX()”的性能

问题描述

样品表发票

|invoice_total | client_id|

|2000          |1         |
|3000          |1         |
|2500          |3         | 
|50            |3         |            

代码 1

SELECT * 
FROM invoices
WHERE invoice_total > (
 SELECT MAX (invoice_total)
 FROM invoices
 WHERE client_ID =3
)

对比

代码 2

SELECT * 
FROM invoices
WHERE invoice_total >  ALL (
 SELECT invoice_total
 FROM invoices
 WHERE client_ID =3
)

我正在浏览一些在线 SQL 视频,讲师说两者是等效的。尽管两者都产生相同的结果,但在性能方面,代码 1 不是比代码 2 更好吗?

据我了解:在代码 1 的情况下,数据库被处理两次:一次获取 max(),第二次获取大于 max() 结果的所有值。复杂度 = N+K

而在代码 2 的情况下,每一行都与子查询的结果列表进行比较。复杂度 = N*K。

或者是否进行了内部优化并且两者具有相同的性能?

标签: mysqlsql

解决方案


它们不会产生相同的结果。

如果 没有发票client = 3,则ALL返回所有行。MAX()不返回任何行。

至于性能,您应该在数据库上进行测试。MySQL 可能对它们进行了类似的优化,但可能存在差异,因为含义不同。


推荐阅读