作者回复: Online DDL的过程是这样的:
1. 拿MDL写锁
2. 降级成MDL读锁
3. 真正做DDL
4. 升级成MDL写锁
5. 释放MDL锁
1、2、4、5如果没有锁冲突,执行时间非常短。第3步占用了DDL绝大部分时间,这期间这个表可以正常读写数据,是因此称为“online ”
我们文中的例子,是在第一步就堵住了
作者回复: 分析得很好。
尤其readonly 对 super 权限无效这句。
作者回复: 嗯 特意写了是MDL“读锁”。
把你的留言置顶了,希望有疑问的同学能看到这个😆
作者回复: 1. Pt的过程也是有操作表结构的,所以会类似
2. 对,没有begin的话,这样select执行完成以后,MDL就自动释放了哦
3. 是,是否online都是第三步(结合置顶评论看哈)的区别,另外四步还是有的
作者回复: InnoDB会把主键字段放到索引定义字段后面,
当然同时也会去重。
所以,当主键是(a,b)的时候,
定义为c的索引,实际上是(c,a,b);
定义为(c,a)的索引,实际上是(c,a,b)
你看着加是相同的
ps 定义为(c,b)的索引,实际上是(c,b,a)
作者回复: 早啊今天😄
作者回复: “难道”正确😄
作者回复: 你用MySQL 客户端试试,我跑出来是文中的顺序哈。给我一下你的MySQL 版本号和workbench版本号
作者回复: 是的,文中写错了。我刚刚修改上去了。抱歉。谢谢提醒
作者回复: 如果说设计初衷,是为了防饿死吧
作者回复: 好问题,
对
而且如果不幸一直拿不到,最后锁超时了,就只好回滚这个DD了操作
作者回复: 赞二刷态度哈
嗯,这个不是读写锁,是锁队列,一进去就开始影响后面的