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

摘要:

在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. 派生表在预处理阶段做相关信息的处理
    4. 派生表使用tmp_table来作为实现方式
  6. mysql的优化是以查询块为基础, 一个查询块是优化的单元

JOIN

  1. 作为SELECT_LEX的一个最核心的执行单位, 每个SELECT_LEX中都存在
  2. JOIN::optimize的上层调用

你可能感兴趣的:(mysql,mysql,数据库,JOIN,查询优化,查询执行)