【MySQL】基于规则的优化(内含子查询优化;派生表;物化表;半连接;标量子查询;行子查询)

概念

  • 常量表:下述两种查询方式查询的表:

    • 类型1:查询的表中一条记录都没有,或者只有一条记录

    • 类型2:使用主键等值匹配或者唯一二级索引列等值匹配作为搜索条件来查询某个表

  • 派生表:放在FROM子句后面的子查询称为派生表。

  • 物化:将子查询结果集中的记录保存到临时表的过程。

  • 物化表存储子查询结果集的临时表

    • 基于内存的物化表哈希索引

    • 基于磁盘的物化表B+树索引

    • 正因为物化表中的记录都建立了索引,通过索引来判断某个操作数是否存在子查询结果集中时,速度会变得非常快,从而提升了子查询语句的性能。

第14章 基于规则的优化(内含子查询优化)

14.1 条件化简

  1. 移除不必要的括号

  2. 常量传递

  3. 移除没用的条件

  4. 表达式计算

  5. HAVING子句和WHERE子句合并

    • 如果查询语句中没有出现聚集函数及GROUP BY子句,则可合并。
  6. 常量表检测

    • 查询优化器在分析一个查询语句时,首先执行常量表查询,然后把查询中涉及该表的条件全部替换为常数,最后再分析其余表的查询成本。

14.2 外连接消除

  1. 外连接 和 内连接 本质区别:

    • 对于外连接的驱动表的记录来说,如果无法在被驱动表中找到匹配ON子句中过滤条件的记录,那么该驱动表记录仍然会被加入到结果集中,对应的被驱动表记录的各个字段使用NULL值填充;

    • 而内连接的驱动表的记录如果无法在被驱动表中找到匹配ON子句中过滤条件的记录,那么该驱动表记录会被舍弃。

  2. 空值拒绝(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.<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值