文章目录

  • 1. 自增ID的问题
  • 2. 淘宝的主键设计
  • 3. 推荐的主键设计
    • 3.1 分类
    • 3.2 UUID(最简单的一种主键设计)
      • 3.1.1 UUID的特点
      • 3.1.2 UUID的组成
      • 3.1.3 为什么UUID是全局唯一的?
      • 3.1.4 为什么UUID占用36个字节
      • 3.1.5 为什么UUID是随机无序的
    • 3.3 UUID改造

1. 自增ID的问题

  1. 可靠性不高

存在自增ID回溯的问题,这个问题直到最新版本的MySQL8.0才修复。

  1. 安全性不高

对外暴露的接口可以非常容易猜测对应的信息。比如:/User/1/这样的接口,可以非常容易猜测用户ID的值为多少,总用户数量有多少,也可以非常容易地通过接口进行数据的爬取。

  1. 性能差

自增ID的性能较差,需要在数据库服务器端生成。

  1. 交互多

业务还需要额外执行一次类似last_insert_id()的函数才能知道刚才插入的自增值,这需要多一次的网络交互。在海量并发的系统中,多1条SQL,就多一次性能上的开销。

  1. 局部唯一性

最重要的一点,自增ID是局部唯一,只在当前数据库实例中唯一,而不是全局唯一,在任意服务器间都是唯一的。对于目前分布式系统来说,这简直就是噩梦。

2. 淘宝的主键设计

订单ID + 时间 + 去重字段 + 用户ID后6位尾数

3. 推荐的主键设计

3.1 分类

非核心业务:对应表的主键自增ID,如告警、日志、监控等信息。

核心业务:主键设计至少应该是全局唯一且是单调递增。全局唯一保证在各系统之间都是唯一的,单调递增是希望插入时不影响数据库性能。

3.2 UUID(最简单的一种主键设计)

3.1.1 UUID的特点

全局唯一,占用36字节,数据无序,插入性能差。

3.1.2 UUID的组成

UUID = UUID=时间+UUID版本(16字节)-时钟序列(4字节)-MAC地址(12字节)

3.1.3 为什么UUID是全局唯一的?

在UUID中时间部分占用60位,存储的类似TIMESTAMP的时间戳,但表示的是从1582-10-15 00:00:00.00到现在的100ns的计数。可以看到UUID存储的时间精度比TIMESTAMPE更高,时间维度发生重复的概率降低到1/100ns。

时钟序列是为了避免时钟被回拨导致产生时间重复的可能性。MAC地址用于全局唯一。

3.1.4 为什么UUID占用36个字节

UUID根据字符串进行存储,设计时还带有无用”-”字符串,因此总共需要36个字节。

3.1.5 为什么UUID是随机无序的

3.3 UUID改造

若将时间高低位互换,则时间就是单调递增的了,也就变得单调递增了。MySQL8.0可以更换时间低位和时间高位的存储方式,这样UUID就是有序的UUID了。

MySQL8.0还解决了UUID存在的空间占用的问题,除去了UUID字符串中无意义的"-"字符串,并且将字符串用二进制类型保存,这样存储空间降低为了16字节

可以通过MysQL8.0提供的uuid_to_bin函数实现上述功能,同样的,MysQL也提供了bin_to_uuid函数进行转化:

SET @uuid = UUID();
SELECT @uuid,uuid_to_bin(@uuid),uuid_to_bin(@uuid,TRUE);

数据库主键如何设计?相关推荐

  1. mysql数据库主键如何设计

    聊一个实际问题,淘宝的数据库的主键是如何设计的呢? 某些错误的离谱的答案还在网上流传着.其中一个明显的错误就是关于mysql的主键设计. 大部分人的回答如此自信就是:用8个自己的bigint做主键,而 ...

  2. 数据库主键的设计和思考

    1. 何谓数据库主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束 ...

  3. MySql数据库主键外键与数据库设计

    MySql数据库主键外键与数据库设计 首先要指出的: 列.字段.属性是一个概念 行.记录.元组是一个概念 MySQL数据库CONSTRAINT约束:非空约束,唯一约束,主键约束,外键约束 show c ...

  4. (转)关于数据库主键和外键(终于弄懂啦)

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如   学生表(学号,姓名,性别,班级)  其中每个学 ...

  5. 再议《反驳 吕震宇的“小议数据库主键选取策略(原创)” 》

    前天发表了篇文章叫<小议数据库主键选取策略(原创)>,随即有网友提出了反驳意见<反驳 吕震宇的"小议数据库主键选取策略(原创)" >,看到后,我又做了做实验 ...

  6. 小议数据库主键选取策略

    我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一 行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引.因为主键可以唯一标识某一行记录,所以可以确保执行数据更 ...

  7. SQL SERVER 数据库主键和外键的思考

    SQL SERVER 数据库主键和外键的思考 什么是主键: 主键是指表中一个列或者列的组合,其值能够唯一的标识表中的每一个行.这样的一列或者多列成为表的主键,通过它可以强制表的实体完整性.当创建或者更 ...

  8. 关于数据库主键和外键

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如   学生表(学号,姓名,性别,班级)  其中每个学 ...

  9. 小议数据库主键选取策略(转自吕震宇老师博文)

    < DOCTYPE html PUBLIC -WCDTD XHTML TransitionalEN httpwwwworgTRxhtmlDTDxhtml-transitionaldtd> ...

最新文章

  1. R语言ggplot2可视化箱图、配置抖动数据点(jitter points)避免数据点互相覆盖、并使用线条(line)连接两个箱图中不同分组成对的数据点(jitter on Boxplots)
  2. eclipse断点调试 出现Source not found
  3. but no declaration can be found for element #39;aop:aspectj-autoproxy#39;.
  4. python模块xlwt怎么用不了_python中使用 xlwt 操作excel的常见方法与问题
  5. Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softmax回归
  6. target ajax,jQuery target - jquery事件
  7. win11更新黑屏无法进入系统怎么办 windows11黑屏更新无法进入系统的解决方法
  8. bzoj 3749: [POI2015]Łasuchy
  9. 有基础学python看什么书好_python入门学习看什么书好,有什么书籍推荐
  10. 果园机器人作文开头_【360教育】写作技巧丨写作技巧小学高年级作文最全技巧100条,建议收藏!...
  11. == 人工智能和机器学习 AIML ==
  12. 应届生计算机工程师岗位初试
  13. WIN10系统开机一个WIFI都找不到,网络适配器里没有WLAN驱动,连接不了网络问题【耗时3天测试10多种方法】
  14. 怎么查看建筑图纸?有什么技巧吗?
  15. Java工具类cntool
  16. 计算机电源功率高好吗,高额定功率等于高功耗吗?教您如何选择计算机电源
  17. 从10亿个数字中找出最大的前100个数
  18. 利用3年日数据检验尾部风险测度(基于风险调整收益)
  19. es6转es5 在线转换工具
  20. Revit插件教学丨Revit中绘制斜楼板的两种方法?

热门文章

  1. linux 使用tget下载磁力链接
  2. c语言共阴极数码管数字6,7段数码管共阴极共阳极的0-9(字形码)
  3. 【chrome】您目前无法访问XXX,因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复
  4. office2021安装mathtype7中遇到的问题
  5. 【进阶开发】如何编译MaixPy工程
  6. 我们需要怎样的百家学术讲坛
  7. Transact-SQL 语法元素之标识符
  8. Delphi7 内存管理及 FastMM 研究 (对于EXE和DLL内存共享很有用) .
  9. python3 爬虫_Python3爬虫介绍
  10. 【原创】开源基于STM32F429 SIP电话