摘要:
在mysql/sql层的查询优化和查询执行的处理中, JOIN这个数据结构或者说类处于核心地位.
本文分析SELECT_LEX, SELECT_UNION, JOIN, JOIN_TAB与表之间的关系.
基本概念:
查询块:
- 能获得独立的结果的select语句部分, 数据结构为SELECT_LEX
- 但是什么叫能独立获得结果?这个说法过于抽象, 需要用具体的场景来进行理解
- 用union或者union all连接起来的两个select语句, 就是两个独立的能获得结果的查询块
- 两个select语句被分别组装成SELECT_LEX
- 这两个SELECT_LEX被装进了SELECT_UNION里
- 用JOIN进行连接的两个表或者多个表, 只能整体获得结果
- 也就是整体被组装成SELECT_LEX
- 每个表作为该SELECT_LEX的JOIN成员的TABLE_LISTC成员存在
- 当select中存在派生表时
- 派生表能独立存在, 所以派生表作为一个SELECT_LEX或者SELECT_UNION单元
- 取决于派生表中是否存在union或union all
- 派生表的SELECT_LEX或者SELECT_UNION作为整个select的一部分, 作为DERIVED_TABLE部分存在
- 派生表在预处理阶段做相关信息的处理
- 派生表能独立存在, 所以派生表作为一个SELECT_LEX或者SELECT_UNION单元