「数据库」就是用于存储数据记录的。既已如此,「记录」便是具有确定性(相对)的信息,其确定性即唯一性。我们得出第一条原因: 「1.数据记录需具有唯一性」 世界是由客观存在及其关系组成的。...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录「按主键顺序存放」,因此每当有一条新的记录插入时,MySQL 会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB...如果表使用自增主键,那么每次插入新的记录,记录就会「顺序添加」到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。这样就会形成一个「紧凑」的索引结构,近似顺序填满。...否则由于每次插入主键的值近似于随机,因此每次新记录都要被插到现有索引页的中间某个位置,MySQL 不得不为了将新记录插到合适位置而「移动数据」,如下图右侧所示,这样就造成了一定的开销。...一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器 hash 值,确保在分布式中不造成冲突,同一台机器的值相同。 PID:进程 ID。2 字节。
MySQL 协议的 RDBMS 上列的一种属性,通过配置该属性来使数据库为该列的值自动赋值,用户不需要为该列赋值,该列的值随着表内记录增加会自动增长,并确保唯一性。...因此单机 RDBMS 产品一般推荐写入连续的序列号,这样每次写入新的记录,都会顺序添加到当前 B+ tree 索引节点的后续位置,当前的数据页写满时,会自动开始新一页的写入。...相反,过于随机的主键值,会导致新记录被写入到数据页的某个中间位置,造成数据的移动而带来了额外的开销。...对于其他三种方案而言,它们都具有集成到应用代码的能力,也因此具有一定的灵活性,本文将以 Twitter snowflake 为例,展示如何设计应用逻辑来获得较高的唯一 ID 生成效率。...Twitter snowflake 生成的唯一序列号类型为整型,由于序列号的前面大部分的 bit 位由时间戳和机器号占据,只有最后的几个 bit 位为递增序列值,因此在一个时间段内生成的序列号的前几位数值相同
每当向表中插入一条新记录时,MySQL都会自动为该记录分配一个唯一的ID值,并且这个ID值会自动递增,确保每个记录都具有不同的ID。...这意味着当向表中插入新记录时,自增主键的初始值为9,并且每次插入新记录时,该主键值会自动递增1。 DEFAULT CHARSET=utf8mb3:指定了表的默认字符集为utf8mb3。...无序性:UUID是随机生成的,不受顺序限制,适合于分布式系统。 缺点: 长度较长:UUID通常为128位,较长的长度可能会占用较大的存储空间。...不易读性:由于UUID是一串数字和字母的组合,不易于人类识别和记忆。 2.4 数据库自增 在数据库中使用自增主键生成ID,每次插入新记录时,数据库会自动分配一个唯一的ID值。...3.1 雪花算法(SnowFlake) 保证了生成的ID具有全局唯一性和趋势递增性,每个ID都是递增的,并且不会出现重复的情况。
编号从1开始,并以1为基数递增; 把0插入auto_increment数据列的效果与插入NULL值一样,但是不建议这样做,还是以插入NULL值为好; 当插入记录时,没有为auto_increment...明确指定值,则等同于插入NULL值; 当插入记录时,如果为auto_increment数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为auto_increment...数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该值插入到数据列中,并使在下一个编号将这个新值开始递增。...UUID经由一定的算法机器生成,为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间、随机数或伪随机数、时序等元素,以及从这些元素生成UUID的算法。...1024个节点) ,最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) 一共加起来刚好64位,为一个Long型。
优势是能保证全球唯一性,缺点是很少使用,常用库基本没有实现; 基于随机数的 UUID:基于随机数或伪随机数生成。...优势是不同名字空间/名字下的 UUID 是唯一的,缺点是 MD5 碰撞问题,只用于向后兼容; 基于名字空间的 UUID(SHA1 版):将基于名字空间的 UUID(MD5 版)中国的散列算法修改为 SHA1...针对上面介绍的数据库自增 ID 的缺陷,会存在以下两种优化方案: 数据库水平拆分,设置不同的初始值和相同的步长。这样可以有效的生成集群中的唯一 ID,也大大降低 ID 生成数据库操作的负载。...对 max_id 字段做一次 update 操作,update max_id = max_id + step,update 成功则说明新号段获取成功,新的号段范围为(max_id, max_id + step...微信序列号生成方案 微信序列号跟用户 uin 绑定,具有以下性质:递增的 64 位整形;使用每个用户独立的 64 位 sequence 的体系,而不是用一个全局的 64 位(或更高位) sequence
优势是能保证全球唯一性,缺点是很少使用,常用库基本没有实现;基于随机数的UUID:基于随机数或伪随机数生成。...优势是不同名字空间/名字下的UUID是唯一的,缺点是MD5碰撞问题,只用于向后兼容;基于名字空间的UUID(SHA1版):将基于名字空间的UUID(MD5版)中国的散列算法修改为SHA1。...针对上面介绍的数据库自增ID的缺陷,会存在以下两种优化方案:数据库水平拆分,设置不同的初始值和相同的步长。这样可以有效的生成集群中的唯一ID,也大大降低ID生成数据库操作的负载。批量生成一批ID。...对max_id字段做一次update操作,update max_id = max_id + step,update成功则说明新号段获取成功,新的号段范围为(max_id, max_id + step]。...微信序列号生成方案微信序列号跟用户uin绑定,具有以下性质:递增的64位整形;使用每个用户独立的64位 sequence 的体系,而不是用一个全局的64位(或更高位) sequence ,很大原因是全局唯一的
自增ID 使用过mysql的同学应该都知道,经常用自增id(auto increment)作为主键,这是一个为long的整数类型,每插入一条记录,该值就会增加1,这样每条记录都有了唯一的id。...replace是insert、update的结合体,对于一条待插入的记录,如果其主键或者唯一索引的值已经存在表中的话,那么会删除旧的那条记录,然后插入新的记录;如果不存在,那么直接插入记录。...,当每次都插入‘a'的时候,会产生新的记录,而新记录的id是自增的(则增步长为2) Flicker的解决办法通俗易懂,但还是没有解决id信息过少的问题,而且还是依赖单独的一组服务(mysql)来生成全局...第一例是当前db中有多少条记录,第二列是使用uuid作为key时插入1 million条记录耗费的时间,第三列是使用64位的整形作为key时插入1 million条记录耗费的时间。...objectid有12个字节,包含时间信息(4字节、秒为单位)、机器标识(3字节)、进程id(2字节)、计数器(3字节,初始值随机)。
这种方法依赖于数据库的内置机制来保证每次插入新记录时自动产生一个唯一的标识符,缺点是难以在分布式环境中维护唯一性。...时间戳+随机数/序列 结合时间戳和随机数(或自定义序列)生成订单号,以保证唯一性和可读性。可以通过添加业务相关的前缀来增强业务相关性。...分布式唯一ID生成方案 在分布式系统中,可以使用像Twitter的Snowflake算法生成唯一的ID。...Snowflake ID结构 Snowflake生成的64位ID可以分为以下几个部分: 1、 1位符号位:由于整数的最高位是符号位,且64位整数中的最高位为符号位,通常这一位为0,保证ID为正数; 2、...每个数据中心最多支持32台机器; 4、 12位序列号:用来记录同一毫秒内生成的不同ID,12位序列号支持每个节点每毫秒产生4096个ID序号; 以下是一个简化的Snowflake算法实现示例: public
最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的方式生成主键记录下来,在查阅资料的过程中,又有了一些新的认识和思考。 主键定义 唯一标识表中每行的一个列(或一组列)称为主键。...主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值...根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性,这与其他大多数编号方案不同。重复UUID码概率接近零,可以忽略不计。...2、在使用uuid作为主键的时候,最好设计createtime(创建时间)列和modifytime(修改时间)列以应付可能的排序等场景。...位datacenterId和5位workerId * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号 * 加起来刚好64
,其中: 3.2 之前的版本(包括 3.2):4 字节时间戳 + 3 字节机器标识符 + 2 字节进程 ID + 3字节随机计数器 3.2 之后版本:4 字节时间戳 + 5 字节随机值 + 3 字节递增计数器...为了保证 UUID 的唯一性,生成因素包括了MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素;UUID 有多个版本,每个版本的算法不同,应用范围也不同: Version 1...Version 3:基于名字的 UUID(MD5),通过计算名字和名字空间的 MD5 散列值得到;一定范围内唯一。...Version 5:基于名字的UUID(SHA1),和 Version 3 类似,只是散列值计算使用SHA1算法;一定范围内唯一。...,就是通过 Zookeeper 的持久顺序节点做为机器 ID) 12 bit :序列号,用来记录同一个毫秒内生成的不同 ID 。
随机UUID – 版本4:根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但是重复的可能性可以忽略不计,因此该版本也是被经常使用的版本。...JDK中使用的就是这个版本。 基于名字的UUID(SHA1) – 版本5:和基于名字的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。...nbyte); System.out.println(uuidFromBytes.toString().replaceAll("-", "")); } 优点 生成简单,本地生成无网络消耗,性能非常高,具有唯一性...Snowflake生成的是Long类型的ID,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特。...', `begin_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '开始id,仅记录初始值,无其他含义。
而若生成的ID可被反解,则从反解出的信息中即可验证ID,从而知道该ID生成时间、从哪个机房发号器生成、为哪个业务服务,这都有助问题排查。 Snowflake算法则可完美弥补UUID缺点。...你可以将别的业务字段值跟当前时间拼接起来,组成一个全局唯一的编号,比如订单编号: 时间戳 + 用户id + 业务含义编码。...,他就把seq累加1,就是自动生成一个毫秒的不同的序号 该算法可以确保每个机房每个机器每一毫秒,最多生成4096个不重复的id。...Snowflake算法设计的非常简单且巧妙,性能上也足够高效,同时也能生成具有全局唯一性、单调递增性和有业务含义的ID,但是它也有一些缺点,最大缺点就是依赖系统时间戳,一旦系统时间不准,就有可能生成重复...解决: 时间戳不记录毫秒而是记录秒,这样在一个时间区间里可以多发出几个号,避免出现分库分表时数据分配不均 生成的序列号的起始号可以做一下随机,这一秒是21,下一秒是30,这样就会尽量的均衡了 生产都使用变种的
禁用随机码:很多人分析生成订单号的时候,第一个念头肯定是不重复唯一性,那么第二个念头可能就是安全性,想要同时满足前两者,很容易想到使用随机码,随机码从一定程度来说,更安全、不重复性更高,但是可读性差,有概率会发生重复...2.1、方案一:UUID UUID 是Universally Unique Indentifier的缩写,翻译为通用唯一识别码,顾名思义 UUID 是一个用于记录唯一标识一条的数据,其按照开放软件基金会...,一般用于于记录用户的手机设备ID等硬件信息!...2.2、方案二:数据库自增 所谓数据库自增,意思是在数据库中给某个列设置为自增列,并且给该列设置一个初始值,代码层面无需任何特殊处理,以 Mysql 的用户表 ID 列为例,可以通过如下方式在创建表的时候生产...其内部结构如下: 可以很清晰的看出,Snowflake 由 4个部分组成: 第一部分:bit 值,为未使用的符号位 第二部分:由 41 位的时间戳(毫秒)构成,它的取值是当前时间相对于某一时间的偏移
一天内不重复,再结合确定日期来保证其唯一性。 N位随机数生成时,可基于系统时间戳,再与一个大数取模生成。...https://github.com/twitter/snowflake Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的...(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) 一共加起来刚好64位,为一个Long型。...利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID。...MongoDB的ObjectId Mongodb集合中的每个document中都必须有一个"_id"键,这个键的值可以是任何类型的,在默认的情况下是个Objectid对象。
❤️ 在软件开发中,生成唯一ID是一项常见而重要的任务。唯一ID的生成不仅仅是为了标识数据记录,还可以应用于分布式系统、数据库主键、日志跟踪等场景。...UUID(Universally Unique Identifier) UUID是一种由时间戳、节点ID和随机数生成的128位标识符。...在关系型数据库中,通常将表的主键设计为自增ID,数据库会自动为新插入的记录分配一个唯一ID。...example_table ( id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255) ); 在插入数据时,数据库会为id字段自动生成唯一递增的值...数据库全局唯一ID(Global Unique Identifier,GUID) 数据库全局唯一ID(GUID)是一种由网络上的计算机生成的128位数字,其唯一性基于随机数和计算机的唯一标识符(通常是MAC
这种情况根据数据库的自增ID就会产生相同ID的情况,不能保证主键的唯一性。 ? 如上图,如果第一个订单存储在 DB1 上则订单 ID 为1,当一个新订单又入库了存储在 DB2 上订单 ID 也为1。...基于名字的UUID(SHA1) - 版本5和基于名字的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。...假设有三台机器,则DB1中order表的起始ID值为1,DB2中order表的起始值为2,DB3中order表的起始值为3,它们自增的步长都为3,则它们的ID生成范围如下图所示: ?...数组每个元素成为一个slot。RingBuffer容量,默认为Snowflake算法中sequence最大值(2^13 = 8192)。...上文阐述过在类 snowflake算法上都存在时钟回拨的问题,Leaf-snowflake在解决时钟回拨的问题上是通过校验自身系统时间与 leaf_forever/${self}节点记录时间做比较然后启动报警的措施
版本1基于时间和节点标识符,版本2(DCE Security UUID)基于域名和时间,版本3和5基于名称空间和名称的散列值,版本4完全随机生成。...// 示例:生成版本3的UUID(基于名称的散列值) String name = "example.com"; UUID uuid3 = UUID.nameUUIDFromBytes(name.getBytes...使用UUID.nameUUIDFromBytes()生成名称基UUID UUID.nameUUIDFromBytes()方法可以根据任意字节序列生成一个版本3的UUID,这个UUID是基于名称的散列值。...使用随机UUID作为数据库记录的唯一标识 在数据库中,UUID常被用作唯一键,以确保每条记录都有一个唯一的标识符。...生成订单号 订单号是电子商务网站中用来唯一标识每个订单的标识符。使用UUID可以确保每个订单号的唯一性。
数据库的主键要如何选择? 数据库中的每一条记录都需要有一个唯一的标识,依据数据库的第二范式,数据库中每一个表中都需要有一个唯一的主键,其他数据元素和主键一一对应。...;12 位的序列号代表着每个节点每毫秒最多可以生成 4096 的 ID。...实现方式 那么了解了 Snowflake 算法的原理之后,我们如何把它工程化,来为业务生成全局唯一的 ID 呢?...Snowflake 算法设计的非常简单且巧妙,性能上也足够高效,同时也能够生成具有全局唯一性、单调递增性和有业务含义的 ID,但是它也有一些缺点,其中最大的缺点就是它依赖于系统的时间戳,一旦系统时间不准...生成的序列号的起始号可以做一下随机,这一秒是 21,下一秒是 30,这样就会尽量的均衡了。
唯一索引:建立在UNIQUE字段上的索引被称为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突。普通索引:建立在普通字段上的索引被称为普通索引。...5:主键索引最好是自增的InnoDB 创建主键索引默认为聚簇索引,数据存储在叶子节点上,叶子节点中的记录都是按照主键值从小到大的顺序排序的,如果主键值是随机的,插入新数据时可能插入到某个数据页中间位置,...6:索引最好设置为not null索引列设置为not null主要有两个原因:NULL 值是一个没意义的值,会占用物理空间,如果表中存在允许为null,则至少占用1字节空间索引列存在 NULL时会使索引...在MySQL的 InnoDB存储引擎中,主键索引是聚簇索引,主键索引的B+树的叶子节点按照顺序存储了主键值及数据,如果主键索引是自增ID,只需要按顺序往后排列即可,因为每次插入一条新记录,都是追加操作,...我看举个栗子,看看什么是页分裂 (盗个网图)如果是非自增主键,那么可能出现如下情况,数据页中的记录主键id是随机的,如下图:随着继续写入数据,写入数据的id并不一定比前一个数据页中记录的id大,此时就会触发页分裂
1、基于时间戳+随机数方式来生成唯一ID 基于时间戳:DateTime.Now.ToString("yyyyMMddHHmmssfffffff")—这种情况很容易出现重复的编号。...这种方式比较适合针对单体应用并发不高的业务系统,生成方式并不是严格意义上的唯一ID。 2、C#仿造Snowflake雪花算法设计 有这么一种说法,自然界中并不存在两片完全一样的雪花的。...(转换成字符串后长度最多19位) ,其基本结构: 第一位:为未使用 第二部分:41位为毫秒级时间(41位的长度可以使用69年) 第三部分:5位datacenterId和5位workerId(...10位的长度最多支持部署1024个节点) 第四部分:最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生...接下来三位是所在主机的唯一标识符,通常是机器主机名的散列值。 接下来两位是产生 ObjectId 的 PID,确保同一台机器上并发产生的 ObjectId 是唯一的。
领取专属 10元无门槛券
手把手带您无忧上云