目录

数据库主键设计原则

常见的主键方案:

自增ID:

UUID:

时间戳作为主键(主键冲突问题)


数据库主键设计原则

  • 确保主键无意义
  • 减少主键变动(应该与重构索引有关)
  • 采用整型主键

常见的主键方案:

自增ID:

优点:

数据库自动编号,速度快,而且是增量增长,聚集型主键按顺序存放,对于检索非常有利。

数字型,占用空间小,易排序,在程序中传递方便。

缺点:

当系统与其他系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突。在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长式字段可能造成数据合并时的主键冲突及表关联关系的丢失。

如果其他系统主键不是数字型,会导致修改主键数据类型,导致其他相关表的修改。

在数据缓冲模式下,很难预先填写主键与外键的值。

自增量的值都是需要在系统中维护一个全局的数据值,每次插入数据时即对此次值进行增量取值。当在产生唯一标识的并发环境中,每次的增量取值都必须为此全局值加锁解锁以保证增量的唯一性。造成并发瓶颈,降低查询性能。每创建一条记录都需要对表加一次锁,在高并发环境下开销较大。

UUID:

优点:

全局唯一性、安全性、可移植性。

能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。

保证生成的ID不仅是表独立的,而且是库独立的,在你切分数据库的时候尤为重要。

缺点:

InnoDB为聚集主键类型的引擎,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生巨大的IO压力。InnoDB主键索引和数据存储位置相关(簇类索引),uuid 主键可能会引起数据位置频繁变动,严重影响性能。

作为主键,UUID长度过长,主键索引KeyLength长度过大,而影响能够基于内存的索引记录数量,进而影响基于内存的索引命中率,而基于硬盘进行索引查询性能很差。严重影响数据库服务器整体的性能表现。

时间戳作为主键(主键冲突问题)

在设计数据库时,我们可以使用时间戳作为主键,但不应该使用时间戳作为主键,否则会产生问题

首先,当我们每次修改数据时,主键值会随着当前修改时间进行更新,如果同时更新多条数据就会造成主键冲突问题

例如:update   student   set    name  =  'bbbgsbz'     where   class = '1';

我们知道一个班级有多名学生,这样就好同时更新多名学生,造成主键冲突

当然我们可以设置主键在更新操作时不更新,但还是会出问题,例如:在高并发访问下同一秒钟插入的数据也会造成主键冲突,因为时间戳的粒度为秒级别,如果一秒钟插入多条数据仍会造成主键冲突,即使我们在业务层产生主键也是同一个道理

时间戳作为数据库主键的问题相关推荐

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

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

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

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

  3. 数据库主键到底是用自增长(INT)好还是UUID好?

    数据库主键到底是用自增长(INT)好还是UUID好? 使用自增长做主键的优点: 1.很小的数据存储空间 2.性能最好 3.容易记忆 使用自增长做主键的缺点: 1.如果存在大量的数据,可能会超出自增长的 ...

  4. 关于数据库主键和外键,索引

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

  5. 使用UUID作为数据库主键产生的问题及解决方案

    序言 看了b站IT老齐的架构三百讲的其中一个短视频,有所体会并记录一下.视频中所讲的财经部门使用的UUID主键,在日终结算时出现磁盘的IO异常,导致应用出现高延迟.最后发现是UUID的问题,UUID作 ...

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

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

  7. 记一次错误使用雪花算法引起的数据库主键冲突和解决时钟回拨问题

    在分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的 有些时候我 ...

  8. 关于数据库主键和外键的作用与区别

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

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

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

最新文章

  1. linux rules.d文件
  2. mongodb聚合查询优化_MongoDB聚合查询详解
  3. 电液伺服系统_电液伺服系统的误差/偏差以及开环增益
  4. 阿里云文件上传工具类
  5. 商业项目中最受欢迎的 7 种编程语言
  6. 架构实战:(一)Redis采用主从架构的原因
  7. html坐标绘制路径,canvas学习笔记之绘制简单路径
  8. 解决nginx无法启动的问题——端口被占用
  9. 百分点舆情洞察系统解决方案
  10. 【JSOI2008】【bzoj1012】最大数maxnumber
  11. POJ 2104 K-th Number (区间第k大)
  12. 拓端tecdat:R语言用加性多元线性回归、随机森林、弹性网络模型预测鲍鱼年龄和可视化
  13. Spring5学习笔记——【遇见狂神说】[IoC、DI、AOP]
  14. EXPDP命令行选项
  15. CentOS 7 搭建CA服务器 实现HTTPS取证
  16. 不用PS,一键生成熊猫头表情包
  17. Chrome 下IndexedDB 本地存储
  18. 四川成都电信天邑TEWA-300AI EPON光猫各种折腾
  19. Spring循环依赖问题,循环依赖的情况,能解决的情况,怎么解决的
  20. C语言从0到1算法小白训练营——day1

热门文章

  1. 【python/qt】Python+Qt实现简单的视频监控界面
  2. 怎么删除旧版计算机密码,BitLocker怎么取消?删除BitLocker密码正确方法
  3. 从苏宁电器到卡巴斯基第31篇:难忘的三年硕士时光 VII
  4. SSH 登陆虚拟机VBox
  5. 中南大学2008级计算机科学张磊,2008级本科生学分制收费标准
  6. 湖北智禾教育:通过装修店铺首页提高转化率的技巧,店铺装修对于淘宝卖家而言是能帮助店铺经营的很重要一步,店铺装修的适当合理能帮助我们提高转化率
  7. 面试官实战-1-素质测评起源和分析
  8. android版本怎么升级8.0,安卓怎么升级8.0版本_安卓升级8.0版本方法_一聚教程网
  9. 移动APP服务端API设计应该考虑到的问题
  10. python 获取lazada菲律宾站地址库