答:InnoDB 有事务级索引记录和范围锁等机制,MyISAM、MEMORY 主要采用表级锁。服务器还统一有元数据等锁,因此选了某个引擎也不能忽略 DDL 阻塞。
答:记录锁保护索引记录,间隙锁限制在一段索引间隙插入,临键锁组合记录及其前面的间隙。它们是 InnoDB 常见范围机制,此外还有其他锁模式。
答:开启死锁检测时,InnoDB 发现循环等待可回滚其中一个事务,使其他事务继续。选择牺牲者时会考虑事务大小,不能保证总是回滚刚开始或最后执行的那个。
答:查看 innodb_deadlock_detect 的实际值,MySQL 8.4 默认通常开启。它是检测等待环的开关,记录所有死锁与查看最近死锁又是不同功能。
答:例如 FLUSH TABLES WITH READ LOCK 获取全局读锁,会限制其他会话写入及相关操作。它可能等待当前工作,也可能让后续写请求排队,因此持有时间需要非常短。
答:缩短事务、用合适索引减少扫描、统一资源访问顺序,并对热点工作限并发。先查持有者和等待者,确定究竟卡在记录、范围还是元数据。
答:只有业务必须有值的字段才应设 NOT NULL。可空列可表达未知或不适用,随意填空字符串或零会丢掉语义。NULL 也能参与索引访问,不能以“可空就不走索引”作理由。
答:能唯一定位记录的一组属性是超键,去不掉任何属性仍能唯一的是候选键,主键是选中的候选键。外键维护引用关系,可以有多行指向同一个目标。
答:如果用户按顺序翻页,保存上一页最后一行的排序键,再用范围条件找下一批。索引匹配时,可以减少扫描并跳过大量偏移行的成本。
答:INNER JOIN 只留下匹配组合。LEFT JOIN 保留左侧未匹配行并给右侧补 NULL,RIGHT JOIN 则保留右侧。一个键匹配多行时,输出行数也会随之增加。