SQL优化技巧 - 显式禁止结果字段排序
· 阅读需 3 分钟
问题定义
在MySQL的早期版本中,即使没有order by子句,group by默认也会按分组字段排序,这就可能导致不必要的文件排序,影响SQL的查询性能。可以通过添加order by null
来强制取消排序,禁用查询结果集的排序;PawSQL识别并进行了重写。
譬如下面的例子中
SELECT l_orderkey, sum(l_quantity)
FROM lineitem
GROUP BY l_orderkey;
在MySQL 5.x版本中,group by l_orderkey
会引起默认排序, 可以通过添加order by null
来避免该排序。
SELECT l_orderkey, sum(l_quantity)
FROM lineitem
GROUP BY l_orderkey
ORDER BY NULL;
重写优化
预警级别
- 警告
触发条件
-
MySQL数据库,版本低于8.0
-
存在分组字段,且无排序字段
数据库类型及版本
- MySQL, 版本低于8.0
在MySQL 8.0中,
group by
本身不会导致对分组字段进行排序,所以可以直接使用group by l_orderkey
,不再需要order by null
。
关于PawSQL
PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,openGauss,Oracle等,提供的SQL优化产品包括
- PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员,
- PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。
- PawSQL Engine, 是PawSQL系列产品的后端优化引擎,可以独立安装部署,并通过http/json的接口提供SQL优化服务。PawSQL Engine以docker镜像的方式提供部署安装。
联系我们
- 邮件:service@pawsql.com
- Twitter: https://twitter.com/pawsql
- 扫描关注PawSQL公众号