首页
学习
活动
专区
圈层
工具
发布

为什么建议使用递增的业务ID

业务ID是我们理解、管理和操作业务实体的关键。通过业务ID,我们可以查询、更新和删除业务实体,也可以跟踪业务实体的状态和历史。 2. 什么是递增的业务ID 递增的业务ID是一种常见的ID生成策略。...例如,我们可以按照业务ID的顺序,来依次处理业务,从而避免了因为业务处理的顺序混乱,导致的业务处理效率低下。 如何生成递增的业务ID 1. 数据库自增ID 这是最常见的生成递增业务ID的方式。...大多数关系型数据库,如MySQL、PostgreSQL等,都支持自增ID。在创建表时,将某一列设置为自增列,数据库会在插入新记录时自动为这一列生成一个递增的值。...优点: 实现简单,只需要在创建表时设置某一列为自增列即可。由于是数据库内部实现,因此性能高(取决于数据库的性能),可靠性强。...缺点: 不适用于分布式系统,因为在分布式系统中,数据可能分布在多个数据库或服务器上,每个数据库或服务器生成的自增ID可能会冲突。

1.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    自增主键竟然不是连续递增

    很多低级开发工程师都想当然觉得自增主键是严格连续递增的,但事实真的如此吗?...假设事务 B 稍后于 A 事务A 事务B 申请到id=2 申请到id=3 此时表t的自增值4 此时表t的自增值4 正确提交了 唯一键冲突 若允许A把自增id回退,即把t的当前自增值改回2,则:...表里已有id=3,而当前自增id值是2。...之所以走进如此的怪圈,就因为“允许自增id回退”这个前提的存在。 所以InnoDB放弃这样的设计,语句即使执行失败了,也不回退自增id! 所以自增id只保证是递增的,但不保证是连续的!...id,会分配4个 依此类推,同一个语句去申请自增id,每次申请到的自增id个数都是上一次的两倍。

    4.5K10

    自增id用完怎么办

    我们知道mysql中存在很多自增id,然后不断增长,由于只要给id定义了这个数的字节长度,那么他就有了上限,比如无符号整型(unsigned int)是4个字节,因此他的上限是2^32-1, 表定义自增值...id 表定义的自增值达到上限后的逻辑是,在申请下一个id时,得到的值保持不变....8个字节的bigint unsigned InnoDB系统自增row_id 如果你创建的InnoDB表没有指定主键,那么InnoDB会给你创建一个不可见的,长度为6字节的row_id,InnoD维护了一个...max_trx_id+1,因此一个事物中至少加2,还有就是innoDB的后台操作,比如表达索引信息统计这个类也是会启动内部事务的因此可以看到,trx_id值并不是按照加1递增的 现在我们看看为什么T2...thread_id 线程id是我们最常见的一种自增id,我使用show processlist的第一列计数就是thread_id, thread_id的逻辑很好理解,系统保存一个全局变量thread_id_conuter

    1.7K20

    自增主键竟然不是连续递增

    很多低级开发工程师都想当然觉得自增主键是严格连续递增的,但事实真的如此吗?...假设事务 B 稍后于 A 事务A 事务B 申请到id=2 申请到id=3 此时表t的自增值4 此时表t的自增值4 正确提交了 唯一键冲突 若允许A把自增id回退,即把t的当前自增值改回2,则:...表里已有id=3,而当前自增id值是2。...之所以走进如此的怪圈,就因为“允许自增id回退”这个前提的存在。 所以InnoDB放弃这样的设计,语句即使执行失败了,也不回退自增id! 所以自增id只保证是递增的,但不保证是连续的!...id,会分配4个 依此类推,同一个语句去申请自增id,每次申请到的自增id个数都是上一次的两倍。

    3.6K00

    MongoDB 实现自增 ID 的最佳实践

    但有时使用自增 ID 可能更符合某些应用场景的需求,例如:兼容现有系统某些系统需要将数据迁移到 MongoDB 时,如果原来使用的是自增 ID 作为主键,在迁移过去之后需要保持自增主键的特点。...这在需要手动输入或与用户交流时特别有用,因为自增 ID 比 ObjectId 更短、更易读。虽然 MongoDB 不支持自增 ID 的功能,但我们仍然可以使用其他方式来实现此功能。...counters 集合的文档结构如下:{ "_id": "posts", "seq_value": 1}该集合有两个字段:_id:代表某个集合的名称。seq_value:为自增序号。...这是因为 MongoDB 的 $inc 操作符能原子性地对文档中指定字段的值进行递增或递减操作。当多个操作同时对同一文档执行 $inc 时,MongoDB 会确保这些操作按顺序依次执行。...小结本文详细探讨了在 MongoDB 中实现自增 ID 序号的方法。

    3.5K41

    MySQL 主键 自增 ID 会用完吗?

    MySQL 主键 自增 ID 会用完吗?...首先我们一般创建 MySQL 数据表的时候,大部分情况下会创建一个自增主键ID 的字段,可能你的建表语句如下: CREATE TABLE IF NOT EXISTS `tb`( `id` INT...所以 在 MySQL 中 自增 ID 是会用完的。那么问题来了,加入他的 ID 用完会发生什么事呢? 我们来验证下。...如果会那么久需要创建 8 字节的 INT 类型了,他的值最大是 2^64-1 那么问题又来了,你说 我有些业务是不需要主键 、不需要自增编号,我不创建这个字段,就好了,这样想恭喜你 回答错误....总结: 自增 ID 用完 会报主键冲突、数据插入失败。 不指定主键、默认创建的 row_id 会 覆盖原有的数据。

    11.9K20

    解决MySQL自增id用尽的问题

    背景介绍我们项目中有一张article_click_record表,用户每次点进一篇文章,就会往该表中插入一条记录article_click_record表主要有如下三列:id:自增主键,INT类型user_id...解决方案首先,对于表的自增id即将溢出的问题,由于该表存在大量记录,因此不能直接将该表的id列改为BIGINT类型我们实际采用的解决id溢出的方式是:新增一张article_click_record_new...id溢出后,新表的数据也就预热完成了,此时只往新表中写入数据,并且在读表时,也可以直接读取新表了 新表的id列采用BIGINT类型的原因: 避免再次出现自增id用尽的问题由于业务需要,我们希望id是保持递增的...已经溢出(MySQL在自增id达到最大值后,下次再获取自增id时,还是会获取到最大值) // 因此,当出现DuplicateKeyException异常时,只需将oldTableIdOverflow...值,因此这里执行的SQL是: // INSERT INTO article_click_record_new(id, user_id, article_id) VALUES(#{id},

    3.3K10

    MySQL replace into导致的自增id问题

    // MySQL replace into导致的自增id问题 // 今天线上遇到一个问题,挺有意思,这里记录一下希望对大家有所帮助。...某个表中,只有一条记录,发生高可用切换之后,自增id的值发生了变化,主从的自增id值不一致,导致数据写入报主键冲突的错误。...=3,age=3这条记录,然后插入id=6,age=3这条记录,自增值变为7....*/; 可以看到,MySQL将replace into的在binlog中保存的格式是update语句,那么update语句本质上不会对自增值进行修改,所以就导致了主从的表自增id不一致,这样虽然看着没有什么问题...,从库的自增id比主库的小,当主从发生切换的时候,这个问题就比较严重了,有些数据写入的时候,就会报错了。

    9.2K20

    MySQL 自增ID的几个小问题

    =4 DEFAULT CHARSET=latin1 自增ID为4,删除ID最大的记录并不影响自增ID的值。...手动插入ID后,下次插入时自增值是多少 例如当前的自增ID为4,新插入记录时,手动指定ID为10,下次使用自增方式插入时,ID是 11。...ID自增值 = 当前最大ID + 1 在插入新记录时,就已经计算得出了新的ID值 实验 创建表 tb2,ID自增: create table tb2(id int unsigned auto_increment...ID的一些特性: 插入新记录时,就会计算出新的自增值(最大ID+1),不管是使用自动ID,还是手动指定一个ID。...删除最大ID值对自增ID值没有影响,但MySQL重启之后有影响,不会使用之前的自增ID值,而是使用最大ID+1,因为自增ID值是存在内存中,重启后需要重新计算。 自增ID用完后就不变了。

    9.5K21

    自增id用完了怎么办

    自增id用完了怎么办 阅读本文大概需要2分钟 1. 表定义自增id 我们通常会把主键设置成自增id,主键id的最大值是 (bigint unsigned)。...InnoDB系统自增row_id 如果创建的表使用InnoDB引擎,但是没有指定主键的话。InnoDB会创建一个不可见,长度为6个字节的row_id。...InnoDB维护了一个全局变量dict_sys.row_id,所有无主键的InnoDB表,每插入一行数据,会将当前时刻的dict_sys.row_id 赋值给row_id,然后自增1。...row_id 的上限是 ,row_id 达到上限后,会归0,然后重新循环,则新插入的数据会覆盖之前的数据(如果row_id一致)。 3. InnoDB trx_id trx_id, 事务id。...InnnoDB内部维护max_trx_id全局变量,每次申请trx_id 获取当前的max_trx_id 然后会将max_trx_id 加1。

    1.4K20

    分布式自增ID算法Snowflake

    但是数据迁移后我们遇到一个问题,之前mysql数据库中,我们采用的是自增id主键,可选用的tidb又对自增主键不是很友好,所以我们选用了另一种主键生成方式:Snowflake算法。...算法原理 SnowFlake算法是Twitter设计的一个可以在分布式系统中生成唯一的ID的算法,它可以满足每秒上万条消息ID分配的请求,这些消息ID是唯一的且有大致的递增顺序。...优缺点 优点: 01 趋势递增:毫秒数在高位,序列号在低位 02 性能高无单点:本地计算不依赖数据库等第三方 03 使用灵活:三个组成部分的位数可按需求调整 缺点: 01 序列不连续 02 无法控制生成规则...= 5 worker_id_bits = 15 sequence_id_bits = 2 max_datacenter_id = 1 << datacenter_id_bits max_worker_id...sid += sequence_id % max_sequence_id 效果 采用Snowflake算法后,数据id可以保持时间递增并且全局唯一。

    1.1K20

    ACCESS 中自增ID的创建和生成

    在 Access 使用过程中,自增ID的存在将带来很大的便利性,既可以唯一标识每行记录,又可以快速知晓文件的行数,那么,如何才能在 Access 表中创建和生成自增ID呢?...1.数据导入时创建 你可能没注意过,在 Access 中导入数据时,是可以直接生成自增ID,且以主键的形式存在。...自动编号”,新值选择 “递增” 模式 ; 4....重新打开表数据,即可看到自增ID列已经生成了。 3.数据追加时生成 如果包含自增ID的数据表已经存在,想追加数据时又该怎么办呢?方法很简单,自增ID列不追加数据就好了。...如下图所示,将 Sheet2 表中数据追加到 no_auto_id,忽略自增ID列的存在,只追加其他数据列就可以了。

    5.7K30

    主键的选择:自增id?UUID?雪花算法?

    一、主键为什么不使用自增id 数据迁移和备份:如果你需要将数据从一个数据库迁移到另一个数据库,或者备份和恢复数据,自增主键可能会导致问题。...例如,如果你在新数据库中已经存在与旧数据库相同的自增 ID,那么插入操作可能会失败。 删除和插入操作:如果表中存在大量删除和插入操作,自增主键可能会导致 ID 值的不连续。...可预测性:自增主键的值是可预测的,因为它们总是按照递增的顺序生成。这可能会带来安全风险,例如,攻击者可能会尝试预测未来的 ID 值来插入恶意数据。...它的设计目标是在分布式系统中生成ID,保证ID的唯一性、有序性和趋势递增。雪花算法的核心思想是将一个64位的ID分成多个部分,分别表示不同的信息。...12bit:序列号 序列号部分占12位,用于在同一毫秒内生成多个ID时进行区分。 如果同一台机器在同一个毫秒内需要生成多个ID,那么序列号会递增。

    1.5K10
    领券