当前位置:网站首页 > SQL数据库编程 > 正文

mysql主键设计原则(mysql主键的定义)




@


最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的方式生成主键记录下来,在查阅资料的过程中,又有了一些新的认识和思考。


唯一标识表中每行的一个列(或一组列)称为主键。主键用来表示一个特定的行。


除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则:

  • 不更新主键列中的值;
  • 不重用主键列的值;
  • 不在主键列中使用可能会更改的值。(例如,如果使用一个
    名字作为主键以标识某个供应商,当该供应商合并和更改其
    名字时,必须更改这个主键。)











使用数据库的自动增长(auto_increment),是比较简单和常见的ID生成方案,数据库内部可以确保生成id的唯一性。

优点:

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

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

缺点:

1、不支持水平分片架构,水平分片的设计当中,这种方法显然不能保证全局唯一。

2、对数据库有依赖,每种数据库可能实现不一样,数据库切换时候,涉及到代码的修改,不利于扩展

结论:

自增id做主键适用于非分布式架构。


UUID:通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID)是用于计算机体系中以识别信息数目的一个128位标识符,还有相关的术语:全局唯一标识符(GUID)。 根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性,这与其他大多数编号方案不同。重复UUID码概率接近零,可以忽略不计。UUID是由一组32位数的16进制数字所构成,标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符。示例:
550e8400-e29b-41d4-a716-0
到目前为止业界一共有5种方式生成UUID,详情可见IETF发布的UUID规范A Universally Unique IDentifier (UUID) URN Namespace 。










优点:

性能非常高:本地生成,没有网络消耗。

在这里插入图片描述








缺点:

1、不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。

2、信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。

3、ID作为主键时在特定的环境会存在一些问题,比如需要排序的时候——UUID是无序的。

4、MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。

5、对MySQL索引不利:作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。

关于MySQL 使用自增ID主键和UUID 作为主键的性能比较可以查看参考【8】。

结论:

1、uuid做主键适用于小规模分布式架构用。

2、在使用uuid作为主键的时候,最好设计createtime(创建时间)列和modifytime(修改时间)列以应付可能的排序等场景。


Twitter的snowflake算法的核心把时间戳,工作机器id,序列号组合在一起。

在这里插入图片描述
除了最高位bit标记为不可用以外,其余三组bit占位均可浮动,看具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,序列号支持1毫秒产生4095个自增序列id。



具体可以查看:https://github.com/twitter-archive/snowflake.git (但是最近一次的提交是6年前,显示已经停止了对初始版snowflake的支持)

源码如下:

 

优点:

1、毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。
2、 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。
3、可以根据自身业务特性分配bit位,非常灵活。







缺点:

强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。

结论:

用自建的id生成器做主键适用于大规模分布式架构

参考:




































到此这篇mysql主键设计原则(mysql主键的定义)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!





版权声明


相关文章:

  • pymssql连接数据库 报错(pymssql连接数据库错误20009)2026-04-04 13:18:09
  • 增删改查sql语句语法结构(sql的增删改查指什么)2026-04-04 13:18:09
  • mysql主键重复会覆盖还是?(mysql主键重复怎么解决)2026-04-04 13:18:09
  • sql ldr(sqlldr导入时跳过一列)2026-04-04 13:18:09
  • mysql主键可以是字符串吗(mysql中主键可以为空吗)2026-04-04 13:18:09
  • sql数据库基础知识(sql数据库基本操作)2026-04-04 13:18:09
  • sql文件(sql文件在哪个位置)2026-04-04 13:18:09
  • mysql查询锁表(MySQL查询锁表记录)2026-04-04 13:18:09
  • 增删改查sql语句关键字(sql增删改查基本语法结构)2026-04-04 13:18:09
  • mysql建立主外键关系(mysql怎么建立主外键关系)2026-04-04 13:18:09
  • 全屏图片