作者回复:
“如果按照这个流程,比如a里面有2行重复的数据, 如果拿b的数据在a中判断,存在则保留,那结果集只有一条数据,”
不会呀,你看它是这样的:
假设join buffer中有两个行1
然后被驱动表取出一个1,
跟join buffer中第一个1比较,发现满足条件,放到结果集;
跟join buffer中第二个1比较,发现满足条件,放到结果集;
是得到两行的
作者回复: 对,驱动表现过滤,然后进join buffer
作者回复: 嗯 我的意思是,如果where条件里面,用到了b.f2的判断,干脆就直接写成join,不需要left join了
如果业务逻辑需要left join, 就要把条件都放到on里面
业务逻辑正确性还是优先的
作者回复: BNL算法拿的数据是确定的只会拿一次(遍历一遍)
而simple nested loop join是会遍历多次的
作者回复: 1. 会
2. 你这里
session 1 成功加锁一个record lock;
session 2执行的是一个select 语句,而且a=1 and b=1就只锁一行(a,b上有联合唯一索引),这里就是要申请一个记录行锁(but not gap waiting)。
这里虽然没有加锁成功,但是已经加入了锁队列(只是这个锁是处于等待状态)
---这时候队列里面有两个锁对象了
然后session 1 再insert失败的时候,就要加next-key lock,(注意这个锁对象跟第一个锁对象不同)。
然后死锁检测看到,2号锁在等1号锁;3号要等2号,而3和1又是同一个session,就认为是死锁了。
作者回复: “自增id的起始值是多少,有没有可能跟已有的记录id冲突?”
如果没有主备延迟就不会出现;
“尤其是备库还没有处理完同步过来的binlog就开始接受客户端请求时。” , 对,这种情况就会。
“如果要求备库必须处理完binlog才能接受客户端请求,那么怎么保证主备切换的过程中,不影响用户使用” 一般都是有这个要求的。要尽量减少影响,就是控制主备延迟。
作者回复: 不好意思,确实你的问题比较难一些
最近在做收尾的工作,后面一定会把问题都清理掉的哈。
你的问题质量高,是我喜欢回答的问题类型😆
作者回复: innblock 可以了解下😆
作者回复: 你可以这么理解, N层放不下的时候,就增加一层来放。
这个行为是由页分裂触发的
在线服务最好不要让索引树超过4层
作者回复: 你可否把表结构、插入数据语句都贴一下?
就是有没有稳定的复现方法(带上MySQL版本号)
作者回复: 看看是不是有什么外部工具在工作
作者回复: 👍
作者回复: 有的,你看一下第40篇 “insert 唯一键冲突”这一段
ps:我已经离开阿里云挺久的了 😆
作者回复: 跟进得很快啊大家😆
作者回复: 就是我这篇末尾建议的几种建表方法,就是建立联系了