mysql - 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。
或者是否进行了内部优化并且两者具有相同的性能?
解决方案
它们不会产生相同的结果。
如果 没有发票client = 3
,则ALL
返回所有行。MAX()
不返回任何行。
至于性能,您应该在数据库上进行测试。MySQL 可能对它们进行了类似的优化,但可能存在差异,因为含义不同。
推荐阅读
- javascript - 根据单击的(“活动”)元素从列表选择选项中计算小计
- frama-c - 在 Frama C 上使用 Alt-ergo 证明 WP 时超时
- javascript - Vue js 应用程序对象语法
- java - 为什么在我实现 Interator 时必须使用 java 泛型类型
- javascript - 无法在 create-react-app 上导入样式表和组件。未找到模块
- python - 使用 get_connection 使连接动态化(django-post_office)“将 get_connection 传递给 EmailMultiAlternatives”的问题
- html - 如何使用css更改链接颜色
- java - Android Studio - 适用于 Android Studio 初学者的 if else 语句
- java - 如何解析文本文件的单个行?
- angular - 找不到名称为“idTypesAccepted”的控件