概念
-
常量表:下述两种查询方式查询的表:
-
类型1:查询的表中
一条记录都没有
,或者只有一条记录
。 -
类型2:使用
主键等值匹配
或者唯一二级索引列等值匹配
作为搜索条件
来查询某个表
-
-
派生表:放在
FROM子句后面的子查询
称为派生表。 -
物化:将子查询结果集中的记录保存到临时表的过程。
-
物化表:存储子查询结果集的临时表。
-
基于内存的物化表有哈希索引;
-
基于磁盘的物化表有 B+树索引。
-
正因为物化表中的记录都建立了索引,通过索引来判断某个操作数是否存在子查询结果集中时,速度会变得非常快,从而提升了子查询语句的性能。
-
第14章 基于规则的优化(内含子查询优化)
14.1 条件化简
-
移除不必要的括号
-
常量传递
-
移除没用的条件
-
表达式计算
-
HAVING子句和WHERE子句合并
- 如果查询语句中没有出现聚集函数及GROUP BY子句,则可合并。
-
常量表检测
- 查询优化器在分析一个查询语句时,首先执行常量表查询,然后把查询中涉及该表的条件全部替换为常数,最后再分析其余表的查询成本。
14.2 外连接消除
-
外连接 和 内连接 本质区别:
-
对于外连接的驱动表的记录来说,如果无法在被驱动表中找到匹配ON子句中过滤条件的记录,那么该驱动表记录仍然会被加入到结果集中,对应的被驱动表记录的各个字段使用NULL值填充;
-
而内连接的驱动表的记录如果无法在被驱动表中找到匹配ON子句中过滤条件的记录,那么该驱动表记录会被舍弃。
-
-
空值拒绝(reject-NULL):在
外连接查询
中,指定的WHERE子句
中包含被驱动表中的列不为NULL值
的条件
称为空值拒绝。-
即:显式指定
被驱动表的某个列
符合IS NOT NULL
,或者,隐含点,直接指定被驱动表的某个列
符合指定的值
,此时就能将 外连接 转为 内连接。select * from t1 left join t2 on t1.m1=t2.m2 where t2.n2 is not NULL; # 等价于 select * from t1 inner join t2 on t1.m1 = t2.m2;
select * from t1 left join t2 on t1.m1=t2.m2 where t2.<
-