SQL优化技巧 - 外连接转化为内连接
· 阅读需 9 分钟
表连接的类型
表连接的类型主要分为内连接、外连接(左外、右外、全外)、交叉连接,关于他们的语义可以参考下图。
此图来自文章(Visual Representation of SQL Joins),描述的非常清楚,本文不做太多赘述。
表连接的类型主要分为内连接、外连接(左外、右外、全外)、交叉连接,关于他们的语义可以参考下图。
此图来自文章(Visual Representation of SQL Joins),描述的非常清楚,本文不做太多赘述。
投影下推(Projection Pushdown)指的通过删除DT子查询中无意义的列(在外查询中没有使用),来减少IO和网络的代价,同时提升优化器在进行表访问的规划时,采用无需回表的优化选项的几率。
考虑下面的例子,
SELECT count(1) FROM (SELECT c_custkey, avg(age) FROM customer group by c_custkey) AS derived_t1;
重写后的SQL为,
SELECT count(1) FROM (SELECT 1 FROM customer group by c_custkey) AS derived_t1;
explain analyze
select * from orders where o_orderdate < all(select o_orderdate from orders where o_custkey > 100)
;
查询折叠(Query Folding)指的是把查询中的视图、CTE或是DT子查询展开,并与引用它的查询语句合并,从而减少查询语句的子查询数目,降低其复杂度的一种优化算法。其收益有以下三个方面:
在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
来避免该排序。