【MySQL系列--优化1】——嵌套join优化
来源:互联网 发布:杰奇小说源码 编辑:程序博客网 时间:2024/06/02 06:59
表达连接的语法允许嵌套连接。以下讨论参见第13.2.9.2节“join语法”中描述的连接语法。
与SQL标准相比,table_factor的语法被扩展。后者仅接受table_reference,而不是一对括号内的列表。如果我们将table_reference项目的列表中的每个逗号都视为与内部连接相同,那么这是一个保守的扩展。例如:
SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
相当于:
SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
在MySQL中,CROSS JOIN在语法上等同于INNER JOIN;他们可以互相替代。在标准SQL中,它们不是等效的。 INNER JOIN与ON子句一起使用;否则使用CROSS JOIN。
通常,只能包含内部连接操作的连接表达式中,括号可以被忽略。考虑这个连接表达式:
t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.b=t3.b OR t2.b IS NULL) ON t1.a=t2.a
删除左侧的括号和分组操作后,该连接表达式将转换为此表达式:
(t1 LEFT JOIN t2 ON t1.a=t2.a) LEFT JOIN t3 ON t2.b=t3.b OR t2.b IS NULL
然而,这两个表达式是不相等的。为了看到这一点,假设表t1,t2和t3具有以下状态:
- Table t1 contains rows (1), (2)
- Table t2 contains row (1,101)
- Table t3 contains row (101)
在这种情况下,第一个表达式返回包含行(1,1,101,101),(2,NULL,NULL,NULL)的结果集,而第二个表达式返回行(1,1,101,101),(2,NULL,NULL, 101):
mysql> SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.b=t3.b OR t2.b IS NULL) ON t1.a=t2.a;+------+------+------+------+| a | a | b | b |+------+------+------+------+| 1 | 1 | 101 | 101 || 2 | NULL | NULL | NULL |+------+------+------+------+mysql> SELECT * FROM (t1 LEFT JOIN t2 ON t1.a=t2.a) LEFT JOIN t3 ON t2.b=t3.b OR t2.b IS NULL;+------+------+------+------+| a | a | b | b |+------+------+------+------+| 1 | 1 | 101 | 101 || 2 | NULL | NULL | 101 |+------+------+------+------+
在以下示例中,外连接操作与内连接操作一起使用:
t1 LEFT JOIN (t2, t3) ON t1.a=t2.a
这个表达式不能被转换为下面的表达式:
t1 LEFT JOIN t2 ON t1.a=t2.a, t3
对于给定的表状态,两个表达式返回不同的行集合:
mysql> SELECT * FROM t1 LEFT JOIN (t2, t3) ON t1.a=t2.a;+------+------+------+------+| a | a | b | b |+------+------+------+------+| 1 | 1 | 101 | 101 || 2 | NULL | NULL | NULL |+------+------+------+------+mysql> SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a, t3;+------+------+------+------+| a | a | b | b |+------+------+------+------+| 1 | 1 | 101 | 101 || 2 | NULL | NULL | 101 |+------+------+------+------+
因此,如果我们使用外部连接运算符在连接表达式中省略括号,我们可能会更改原始表达式的结果集。
更准确地说,我们不能忽略左外连接操作的右操作数和右连接操作的左操作数中的括号。换句话说,我们不能忽略外连接操作的内表表达式的括号。可以忽略其他操作数的圆括号(外部表的操作数)。
下面的表达式:
(t1,t2) LEFT JOIN t3 ON P(t2.b,t3.b)
对于任何表t1,t2,t3和属性t2.b和t3.b上的任何条件P,等效于此表达式:
t1, t2 LEFT JOIN t3 ON P(t2.b,t3.b)
每当在连接表达式(join_table)中执行连接操作的顺序不是从左到右,我们讨论嵌套连接。考虑以下查询:
SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.b=t3.b) ON t1.a=t2.a WHERE t1.a > 1SELECT * FROM t1 LEFT JOIN (t2, t3) ON t1.a=t2.a WHERE (t2.b=t3.b OR t2.b IS NULL) AND t1.a > 1
这些查询被认为包含这些嵌套连接:
t2 LEFT JOIN t3 ON t2.b=t3.bt2, t3
- 【MySQL系列--优化1】——嵌套join优化
- MySQL如何优化嵌套Join
- MySQL优化——join的使用
- [MySQL优化案例]系列 — 分页优化
- [MySQL优化案例]系列 — 分页优化
- 【MYSQL系列-优化4】——阻止嵌套循环和批量密钥访问连接
- mysql的join优化
- MySQL join 查询优化
- MySQL优化之JOIN
- mysql-join优化
- MySQL left join优化
- 【MySQL系列--优化3】——多范围读取优化
- 【MYSQL系列--优化5】——Is Null 优化
- [MySQL优化案例]系列 — slave延迟很大优化方法
- [MySQL优化案例]系列 — slave延迟很大优化方法
- MySQL系列—特定类型查询优化
- MySQL系列—慢查询优化案例
- MySQL Query 的优化—Join的实现原理及优化思路
- HDU 6069 Counting Divisors (2017 Multi-Univ Training Contest 4)
- 全国法院名录json
- Kotlin配合Gson进行json数据解析
- TotalCommander使用教程
- spring配置文件配置过程
- 【MySQL系列--优化1】——嵌套join优化
- 收藏记录
- [caioj] 问题 E: 单调队列3 (线段树)
- 推荐一个很好用的 Android Studio 插件
- React生命周期全解和state避坑
- HDU 6075 Questionnaire
- 图片的二次采样
- POJ3468 树状数组的区间更新和区间求和
- Hawq超过最大允许连接数