老大问:建表为啥还设置个自增 id ?用流水号当主键不正好么( 二 )


索引这里仅介绍 InnoDB 引擎 , 具体可以参考官方文档 , 并且介绍的相对比较简单 。
索引分类

  1. 聚簇索引:表存储是根据主键列的值组织的 , 以加快涉及主键列的查询和排序 。 在介绍主键时也对聚簇索引进行了介绍 。
  2. 二级索引:也可以叫辅助索引 , 在辅助索引中会记录对应的主键列以及辅助索引列 。 根据辅助索引进行搜索的时候 , 会先根据辅助索引获取到对应的主键列 , 然后再根据主键去聚簇索引里面搜索 。 一般不建议主键很长 , 因为主键很长辅助索引就会使用更多的空间 。
补充:
回表:先在二级索引查询到对应的主键值 , 然后根据主键再去聚簇索引里面去查询 。索引覆盖:二级索引记录了主键列和二级索引列 , 如果我只查询主键列的值和二级索引列的值 , 那就不需要回表了 。
索引的物理结构InnoDB 使用的 B+ 数数据结构 , 根据聚簇索引值(主键/UNQIUE/或者自己生成)构建一颗 B+ 树 , 叶子节点中存放行记录数据 , 所以每个叶子节点也可以叫数据页 。 每个数据页大小默认为 16k , 支持自定义 。
老大问:建表为啥还设置个自增 id ?用流水号当主键不正好么文章插图
数据的插入当数据插入时 , InnoDB 会使页面 1/16 空闲 , 以备将来插入和更新索引记录 。
  1. 顺序插入(升序或降序):会将索引页剩余的大约 15/16 装满
  2. 随机插入:只会使用容量的 1/2 到 15/16
在随机插入中 , 会频繁的移动、分页 , 从而造成大量的碎片 , 并且使索引树不够紧凑 。 而使用顺序插入的方式 , 则数据比较紧凑 , 有更高的空间利用率 。
总结Q&AQ: 什么是回表和索引覆盖?
A:
  1. 回表:先在二级索引查询到对应的主键值 , 然后根据主键再去聚簇索引里面去查询 。
  2. 索引覆盖:二级索引记录了主键列和二级索引列 , 如果我只查询主键列的值和二级索引列的值 , 那就不需要回表了 。
Q: 为什么要设置自增主键 id ?
A:
  1. 可以唯一标识一行数据 , 在 InnoDB 构建索引树的时候会使用主键 。
  2. 自增 id 是顺序的 , 可以保证索引树上的数据比较紧凑 , 有更高的空间利用率以及减少数据页的分裂合并等操作 , 提高效率 。
  3. 一般使用手机号、身份证号作为主键等并不能保证顺序性 。
  4. 流水号一般相对较长 , 比如 28 位 , 32 位等 , 过长的话会二级索引占用空间较多 。 同时为了业务需求 , 流水号具有一定的随机性 。
结束语本文主要通过查阅资料 , 了解为什么要设置一个和业务无关的自增 id 用来当做主键 , 很多内容比较浅显 , 比如 InnoDB 的 B+ 树 , 页分裂及页合并 , 插入过程等都没有进行深入研究 , 有兴趣的小伙伴可以更深入的研究下 。
同时在建表时除了要设置一个自增 id 用来当做主键 , 小伙伴们在业务开发过程中是否也会遇到一种情况:用户的注销 , 数据的删除等都是进行的逻辑删除 , 而不是物理删除 。
本篇文章介绍比较简陋 , 不足之处 , 希望大家多多指正 。
【老大问:建表为啥还设置个自增 id ?用流水号当主键不正好么】作者:liuzhihang链接:来源:掘金著作权归作者所有 。 商业转载请联系作者获得授权 , 非商业转载请注明出处 。


推荐阅读