13. 为什么推荐使用自增长主键作为索引?
自增主键的优势
主键是聚簇索引(Clusterd Index)的基础,直接决定数据的物理存储顺序。
- 插入性能高
- 自增长主键是 按顺序递增的,插入新记录时总是追加到 B+ 树的最右叶子节点。
- 不会触发B+树的中间页插入,页分裂(Page Split)等操作,减少磁盘IO和锁竞争。
- 聚簇索引更加紧凑
- 数据按主键顺序排序,存储连续性好,更适合范围查询和顺序扫描。
- 页中空间利用率高,缓存在内存中的效果也更优。
用字符串类型主键的劣势 以 UUID、雪花 ID、用户自定义的字符串为主键
1. 插入无序,频繁触发页分裂
- 字符串主键插入是随机的,新记录可能插入 B+ 树中间节点,频繁导致页分裂。
- 页分裂后可能产生页移动、碎片、锁等待增加等问题。
字符串比较慢
- 数据库需要按字节逐位比较字符串,性能明显差于整数比较。
14. 使用int自增主键后 最大id是10,删除id 10和9,再添加一条记录,最后添加的id是几?删除后重启mysql然后添加一条记录最后id是几
当前最大 id = 10,然后:
- 删除 id 为 9 和 10 的记录
- 添加一条新记录
- 再 重启 MySQL
- 再 添加一条新记录
• MySQL 的 AUTO_INCREMENT 是基于当前表的最大 id,而不是“当前存在的 id” 即使 9 和 10 被删除,MySQL 仍然会从最大值(10)基础上 +1
- 是否重启 通常不会改变自增值。
- 但行为与 存储引擎类型 有关,尤其是在崩溃后未提交事务或没有刷新 binlog 的情况下。
自增值默认保存在内存中,重启可能会回退到磁盘上记录的最大 id。