2023-06-13 mysql-查询优化器-SELECT_LEX, SELECT_UNION, JOIN, JOIN_TAB与表之间的关系-分析

本文深入探讨MySQL查询优化和执行过程,重点解析SELECT_LEX、SELECT_UNION、JOIN和JOIN_TAB在处理JOIN操作时的角色。JOIN作为查询块的核心,其优化和执行基于JOIN_TAB,它存储了表访问的相关信息。派生表作为独立的SELECT_LEX或SELECT_UNION单元,预处理阶段使用tmp_table实现。EXPLAIN输出以表为基本单位,显示JOIN_TAB的详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:

在mysql/sql层的查询优化和查询执行的处理中, JOIN这个数据结构或者说类处于核心地位.

本文分析SELECT_LEX, SELECT_UNION, JOIN, JOIN_TAB与表之间的关系.

基本概念:

查询块:

  1. 能获得独立的结果的select语句部分, 数据结构为SELECT_LEX
  2. 但是什么叫能独立获得结果?这个说法过于抽象, 需要用具体的场景来进行理解
  3. 用union或者union all连接起来的两个select语句, 就是两个独立的能获得结果的查询块
    1. 两个select语句被分别组装成SELECT_LEX
    2. 这两个SELECT_LEX被装进了SELECT_UNION里
  4. 用JOIN进行连接的两个表或者多个表, 只能整体获得结果
    1. 也就是整体被组装成SELECT_LEX
    2. 每个表作为该SELECT_LEX的JOIN成员的TABLE_LISTC成员存在 
  5. 当select中存在派生表时
    1. 派生表能独立存在, 所以派生表作为一个SELECT_LEX或者SELECT_UNION单元
      1. 取决于派生表中是否存在union或union all
    2. 派生表的SELECT_LEX或者SELECT_UNION作为整个select的一部分, 作为DERIVED_TABLE部分存在
    3. 派生表在预处理阶段做相关信息的处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟世者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值