一、概述
对于 left join 的优化,是应用开发人员、数据库内核开发人员关注的问题之一。
应用开发人员关注是因为:并不是每个数据库的内核都支持 left join 的内部转化,这时
候需要应用开发人员进行手工地转化。
内核开发人员关注是因为:并不假定每个应用开发人员都能够熟练地将 left join 转化掉。
因此数据库有必要对这种情况,进行数据库内部的优化。
我当初对 left join 进行分析归纳,后来阅读 mysql 时发现 sql_select.cpp 文件中的
simplify_joins()函数的实现方法也是这样的,大家可以参考该函数。
二、left join 优化规则的研究
t1 left t2 on t1.col1=t2.col1
对于类似的表达式,在什么样的情况下才可以去掉 left join 呢?
我们首先创建三张表:
create table t1(c1 int,c2 int);
create table t2(d1 int,d2 int);
create table t3(e1 int,e2 int);
2.1 优化的基本策略
对于 left join 的查询语句,比如:
select * from t1 left join t2 on t1.c1=t2.d2 where condition1 [{and
conditonN}];(N 的取值为 2,3,……) (语句 1)
什么情况下,才能优化为语句:
select * from t1 inner join t2 on on t1.c1=t2.d2 where condition1 [{and
conditonN}]; (语句 2)
备注:语句 2 等价于语句:
select * from t1,t2 where t1.c1=t2.d2 and condition1 [{and conditonN}]; (语
句 3)
回答:
只要 where 中的至少有一个 conditionK(N 的取值为 1,2,……)满足如下非 NULL 条件,
就可以将语句 1 优化为语句 2(语句 3):
1)conditionK 包含 t2 表的列(任意列)
2)conditionK 的类型只要不为: t2.column is null。
其它的任何类型都行:比如 t2.d2=t1.c2,再比如 t2.d2 is not null。
例 1:
select * from t1 left join t2 on t1.c1=t2.d2 where t2.d1=2; (t2.d1=2 满足非
NULL 条件,可以优化)
<==>等价于: select * from t1 inner join t2 on t1.c1=t2.d2 where t2.d1=2;
<==>等价于: select * from t1,t2 where t1.c1=t2.d2 and t2.d1=2;
评论0
最新资源