项目 GitHub 地址:https://github.com/Meituan-Dianping/SQLAdvisor
结构流程图
main -> where -> cardinality desc
|
parse join
|
group by
|
order by
|
过滤重复索引

Mysql 中联接SQL语句中,ON子句的语法格式为:table1.column_name = table2.column_name。
当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USING 语法来简化 ON 语法,格式为:USING(column_name)。
[sql]
SELECT f.color, c.is_primary, c.is_dark, c.is_rainbow
FROM flags f
INNER JOIN color c ON f.color = c.color
WHERE f.country = 'China';
[sql]
SELECT f.color, c.is_primary, c.is_dark, c.is_rainbow
FROM flags f
INNER JOIN color c USING(color)
WHERE f.country = 'China';
二叉树
二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。

2.1 join 处理
join语法分为两种:join on 和 join using。并且join on 有时会存在where条件中。
分析Join条件首先会得到一个nested_join的table list,通过判断它的join_using_fields 字段是否为空来区分Join on 与Join using。
生成的table list 以二叉树的形式进行存储,以后序遍历的方式对二叉树进行遍历。
生成内部解析树时,right join 会转换成 left Join
join条件会存在当层的叶子节点上,如果左右节点都是叶子节点,会存在右叶子节点
每一个非叶子节点代表一次Join的结果。
本文分享自微信公众号 - dba笔记,如有侵权,请联系 service001@enmotech.com 删除。




