知识点
1 工作中会问好问题是一个重要的能力
2 用 left join 不一定左表是驱动表
3 多个条件 join 写 on 里和一个写 where 里一样 , 但是 left join 就不一样 , 因为左表不一定是驱动表
4 a , b 表 f1 ,f2 字段 , a 的f1 有索引 , 4 条相同记录
5 Block Nested Loop Join 算法 因为 b 表f1 无索引 b 是被驱动表
6 BNL执行逻辑 1. 表 a 内容全部读入 join_buffer , 顺序扫描表 b , 每一行都判断 join 条件 , 满足则作为结果集返回 , 如果有 where 需要先判断 where 再返回 , 扫描完后 , 没有匹配上的补 NULL 再返回结果集
7 一张 BNL 的图 ? 贴这里
8 第二条语句以 b 为驱动表
9 extra 什么都没写 , 表示使用 Index Nested Loop Join , NLJ
10 NLJ 执行逻辑 : 顺序扫描表 b , 每一行到表 a 查 , 匹配到记录后再判断 f2=f2 , 满足则返回作为一条结果
11 Q2 被优化器优化了
12 NULL=NULL 结果为 NULL NULL!=NULL 结果也为 NULL 不是 true 所以不会作为结果集
13 根据 12 知识点 , 此时的 left join 和 join 效果一致 , 被优化器改写为 join , 使用 NLJ 算法
14 join 条件放 on 和 where 没有区别
15 如果要 left join 语义则必须都放 on 里
16 Simple Nested Loop Join 和 BNL 的性能对比 , BNL 更好 ?
17 知识点 16 两个的执行逻辑是?
18 把 groupby 当 distinct 用 , 有什么不同 , 答案是没有
19 标准的 groupby 需要select 加聚合函数 如 count()
20 此时的 distinct 和 groupby 执行逻辑 : 1 创建临时表 , a 字段建立唯一索引 , 遍历表 t , 插入临时表 , 有冲突则跳过 3 返回结果
21 一个备库自增主键问题
22 一个思考题
网友评论