前言

在设计数据库表的时候,MySQL官方推荐不要使用uuid或者不重复不连续的雪花id(long型且id唯一,单机递增),而是腿甲使用自增id,推荐使用auto_increment

自增id做主键

在设计数据库表时,自增id 通过auto_increment,id依次递增,一般来说插入的id为上一个id值加1。

  • 使用自增id,如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含NULL值的唯一索引作为主键索引、如果也没有这样的值作为主键索引,则InnoDB会选择设置内置6字节长的ROWID作为隐含的聚集索引(ROWID随着航记录的写入设置逐渐递增)
  • 记录本身存放在主索引(一颗B+tree)的叶子节点上。这就需要同一个叶子节点内(大小为一个内存页或者磁盘页)的各个记录按照主键顺序存放,每当一天记录插入时,MySQL会根据其主键将其插入当前适当的节点位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟为一个新的页
  • 使用主键自增,每次插入一条新的记录,记录就会沿着当前索引节点的后续位置,当一页写满,就会开辟一个新的页
  • 减少了叶分裂和碎片的产生
  • 自增id主键可能不连续,造成不连续的情况可能有:
    • 唯一主键冲突
    • 事务回滚
    • insert…select语句批量申请自增id

UUID做主键

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。另外我们也可以在e2fsprogs包中的UUID库找到实现。

  • 使用UUId做主键,可以减少主键ID冲突
  • 使用UUID,生成的id不仅是独立的,而且库是独立的。对以后的数据库操作提供了极大地方便。
  • 写入的目标页很可能已经刷新到磁盘上并从缓存上移除,或者还没有加载到缓存中,InnoDB在插入之前就不得不先找到并从磁盘中读取目标页到内存中,这将导致大量的随机IO操作
  • 由于斜入式乱序的,InnoDB不得不频繁的做分页操作,以便为新的行分配空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上
  • 由于频繁的分页操作 ,页会变得稀疏并被不规则的填充,最终会导致数据有碎片。在把随机值(uuid和雪花id)载入到聚簇索引(innodb默认的索引类型)以后,有时候会需要做一次OPTIMEIZE TABLE来重建表并优化页的填充,这将又需要一定的时间消耗。
    综上所述可得:
  1. 如果INnoDB表的数据写入顺序可以和B+树缩印的叶子节点顺序一致的话,此时存储效率最高。为了存储和查找性能应该使用自增ID作为主键
  2. 对于InnoDB的主键索引,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生大量的IO压力,此时不适合使用UUID作为物理主键,可以作为逻辑主键,物理主键仍未自增id。为了全局唯一性,应该使用UUID做索引关联其他表或做外键

mysql自增id与uuid的区别相关推荐

  1. 详解:MySQL自增ID与UUID的优缺点及选择建议,MySQL有序uuid与自定义函数实现

    文章目录 1.自增ID的优缺点 1.1 优点 1.2 缺点 1.3 不适合以自增ID主键作为主键的情况 2.UUID作为主键 2.1 介绍 2.2 优点 2.3 缺点 3.有序UUID作为主键 3.1 ...

  2. Mysql 自增id、uuid与雪花id

    概念介绍 三种主键 自增id :1 2 3 4 5-- uuid :UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生 ...

  3. MySQL 数据表主键设计,选择自增 id 还是 UUID 还是雪花 id?

    在 MySQL 数据表的设计中,官方推荐我们不要使用 UUID 或者其他不连续不重复的 id,而是推荐使用连续自增的主键 id(auto_increment). 随着现在许多项目都涉及到了分布式或者微 ...

  4. 技术分享 | 关于 MySQL 自增 ID 的事儿

    作者:贲绍华 爱可生研发中心工程师,负责项目的需求与维护工作.其他身份:柯基铲屎官. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 当我们使用 M ...

  5. Mysql自增id理解

    MySQL自增ID 1. 什么是自增id 自增ID是在设计表时如果将id字段的值设置为自增的形式也就是AUTO_INCREMENT,那么当插入一行数据时就无需指定id,数据表会根据前一个id值+1进行 ...

  6. 45 MySQL自增id

    45 MySQL自增id 表定义自增id 说到自增id,前面提到mysql的自增id不连续,当表定义的自增值达到上限后的逻辑是:再申请下一个id时,得到的值保持不变 create table t(id ...

  7. mysql自动增长id 溢出_MySQL表自增id溢出的故障复盘怎么解决 MySQL表自增id溢出的故障复盘解决方法...

    MySQL表自增id溢出的故障复盘如何解决?本篇文章小编给大家分享一下MySQL表自增id溢出的故障复盘解决方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 问题:MyS ...

  8. 修改 MySQL 自增ID的起始值

    修改 MySQL 自增ID的起始值 alter table users AUTO_INCREMENT=10000; posted on 2019-04-15 17:45 流易 阅读(...) 评论(. ...

  9. mysql自增id用完了_MySQL表自增id用完了该怎么办?

    我们知道MySQL表可以定义一个自增长的id,如果我们的表没有指定主键字段,那MySQL会给我们的表创建一个不可见的,长度为6个自己的row_id,然后不停地往上加步长,虽然生活中自然数是没有上限的, ...

最新文章

  1. 聚类分析和主成分分析
  2. 计算机无法转换输入发,电脑输入法切换不了怎么办
  3. 山东青岛职称计算机报名时间2015,青岛市2015年第二次职称计算机考试时间
  4. Protobuf序列化的原理-存储格式
  5. python操作excel表格写入多行和多列_python多处理:写入同一excel-fi
  6. ADF声明性组件示例
  7. centos6安装mysql并远程连接_Ubantu下MySQL安装、部署和远程连接
  8. 2019至今TIOBE编程语言排行榜Top 20,Python完胜C++了吗?
  9. 【clickhouse】clickhouse 分区表
  10. HTML固定内容的css代码,普通文本重内容的HTML/CSS设计
  11. Linux -chattr -隐藏权限(附加权限)
  12. gstreamer向appsrc发送数据的代码
  13. VB基础知识整理——没干货哪敢打扰你
  14. 基于Unity3D的AR射击游戏设计与实现
  15. 十六进制下的(6+2) 8位数颜色代码
  16. c语言中的EOF是什么意思
  17. 51单片机之共阳极静态数码管
  18. MatLab实现的ftt大数乘法
  19. 【一步步学OpenGL 19】 -《镜面反射光》
  20. cip核字号验证_cip核字号(cip数据核字号查询官网)

热门文章

  1. win7 + vmware + Mac OSX + 共文件共享
  2. uni-app开发微信公众号扫码功能(2)-微信token缓存
  3. 架构初探-谁动了我的蛋糕
  4. mysql导入sql文件方法
  5. 人生不一定有那么多重逢
  6. 怎么看matlab程序运行到哪了,matlab中记录程序运行时间
  7. 深度学习超级采样(DLSS)到底是什么?
  8. SAP-MM 移动平均价和标准价
  9. 重返天梯-L2-028 秀恩爱分得快 (25 分)
  10. 八爪鱼抓取html,最全的八爪鱼循环提取网站网页数据方法.docx