[MySQL面试题]-索引 13-14 为什么推荐使用自增长主键作为索引?

88 阅读2分钟

image.png

13. 为什么推荐使用自增长主键作为索引?

自增主键的优势

主键是聚簇索引(Clusterd Index)的基础,直接决定数据的物理存储顺序。

  1. 插入性能高
  • 自增长主键是 按顺序递增的,插入新记录时总是追加到 B+ 树的最右叶子节点。
  • 不会触发B+树的中间页插入,页分裂(Page Split)等操作,减少磁盘IO和锁竞争
  1. 聚簇索引更加紧凑
  • 数据按主键顺序排序,存储连续性好,更适合范围查询和顺序扫描。
  • 页中空间利用率高,缓存在内存中的效果也更优。

用字符串类型主键的劣势 以 UUID、雪花 ID、用户自定义的字符串为主键

1. 插入无序,频繁触发页分裂

  • 字符串主键插入是随机的,新记录可能插入 B+ 树中间节点,频繁导致页分裂。
  • 页分裂后可能产生页移动、碎片、锁等待增加等问题。

字符串比较慢

  • 数据库需要按字节逐位比较字符串,性能明显差于整数比较。

14. 使用int自增主键后 最大id是10,删除id 10和9,再添加一条记录,最后添加的id是几?删除后重启mysql然后添加一条记录最后id是几

当前最大 id = 10,然后:

  1. 删除 id 为 9 和 10 的记录
  2. 添加一条新记录
  3. 重启 MySQL
  4. 添加一条新记录

• MySQL 的 AUTO_INCREMENT 是基于当前表的最大 id,而不是“当前存在的 id” 即使 9 和 10 被删除,MySQL 仍然会从最大值(10)基础上 +1

  • 是否重启 通常不会改变自增值
  • 但行为与 存储引擎类型 有关,尤其是在崩溃后未提交事务没有刷新 binlog 的情况下

自增值默认保存在内存中,重启可能会回退到磁盘上记录的最大 id。