首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

字节面试:MySQLID用完怎样?

在一些中小型项目开发中,我们通常会使用 ID 来作为主键的生成策略,但随着时间的推移,数据库的信息也越来越多,尤其是使用 ID 作为日志表的主键生成策略时,可能很快就会遇到 ID 被用完的情况...PS:当然,在分库分表的场景中,我们通常会使用雪花算法来替代 ID,但中小型项目开发中,使用 ID 的场景还是比较多的。...1.IDMySQL 中,如果字段的数据类型为整数类型(如 INT、BIGINT 等),则可以通过关键字“AUTO_INCREMENT”来设置让当前的字段实现,例如以下 SQL: CREATE...1.2 缺点分析 ID 的缺点如下: 在数据进行迁移或分库分表时,可能会出现问题,需要特殊处理。 如果数据量非常大,可能达到 ID 的上限。...存在安全性问题,比如通过 ID 可能推测出一些业务信息。例如,一个电商订单表使用 ID 作为主键,可能会被竞争对手通过订单号大致推测出业务量等信息。2.ID用完怎样?

11010

数据库ID用完了怎样

我在工作中经常会遇到有人问我,数据库表的ID的,那么如果ID用完了怎么样?...说实话,我一直从事的是政企行业的开发,因为是传统行业,并且数据量基本上增长缓慢,所以到目前为止我还没遇到过ID用完的情况。因此我连夜做了实验,并编写了这篇文章将结果分享出来。...(全文以MySQL为例,因为MySQL最常用) 一、有主键 在MySQL中int类型占4个字符,因为ID大部分都是以1开始,所以它的取值范围为1到2^32-1,也就是1到4294967295。...首先我们创建一张表,并设置ID,且从2147483647开始。...从这里得知,在有主键且主键的情况下,ID达到上限后MySQL会报错。

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

面试官:数据库 ID 用完了咋样?

他问了我一个有意(keng)思(b)问题: 数据库中的 ID 用完了该怎么办? 这个问题其实可以分为有主键 & 无主键两种情况回答。 国际惯例,先上张脑图: ?...02 有主键 如果你的表有主键,并且把主键设置为。 在 MySQL 中,一般会把主键设置成 int 型。...每次插入一条数据,都把全局 row_id 当成主键 id,然后全局 row_id 加 1。 这种情况的数据库 ID 用完会发生什么呢?...04 总结 数据库主键用完后分两种情况: 有主键,报主键冲突 无主键,InnDB 自动生成一个全局的 row_id。它到达最大值后会从 0 开始算,遇到 row_id 一样时,新数据覆盖旧数据。...为什么我说这是个有意(keng)思(b)问题? 我的回答除了以上解决方法外,还提到在业务开发中,我们不会等到主键用完那天就已经分库分表了,基本不会遇到这种情况。

51631

MySQL replace into导致的id问题

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

7K20

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 覆盖原有的数据。

9.5K20

浩鲸科技:为什么要用雪花ID替代数据库ID

今天咱们来看一道数据库中比较经典的面试问题:为什么要使用雪花 ID 替代数据库 ID?同时这道题也出现在了浩鲸科技的 Java 面试中,下面我们一起来看吧。...浩鲸科技的面试题如下:其他面试题相对来说比较简单,大部人题目都可以在我的网站上(www.javacn.site)找到答案,这里就不再赘述,咱们今天只聊“为什么要使用雪花 ID 替代数据库 ID?”...这个本地时钟定期与系统时钟进行同步,如果检测到系统时钟往前走了(出现了时钟回拨),则将本地时钟调整为系统时钟。4.为什么要使用雪花 ID 替代数据库 ID?...例如,数据库分片之后,会在同一张业务表的分片数据库中产生相同 ID数据库 ID 是由每个数据库单独记录和增加的),这样就会导致,同一个业务表的竟然有相同的 ID,而且相同 ID 背后存储的数据又完全不同...小结数据库 ID 只适用于单机数据库环境,而对于分库、分表、数据分片来说, ID 不具备唯一性,所以要要使用雪花 ID 来替代数据库 ID

42210

浩鲸科技:为什么要用雪花ID替代数据库ID

浩鲸科技的面试题如下: 其他面试题相对来说比较简单,大部人题目都可以在我的网站上(www.javacn.site)找到答案,这里就不再赘述,咱们今天只聊“为什么要使用雪花 ID 替代数据库 ID...这个本地时钟定期与系统时钟进行同步,如果检测到系统时钟往前走了(出现了时钟回拨),则将本地时钟调整为系统时钟。 4.为什么要使用雪花 ID 替代数据库 ID?...数据库 ID 只适用于单机环境,但如果是分布式环境,是将数据库进行分库、分表或数据库分片等操作时,那么数据库 ID 就有问题了。...例如,数据库分片之后,会在同一张业务表的分片数据库中产生相同 ID数据库 ID 是由每个数据库单独记录和增加的),这样就会导致,同一个业务表的竟然有相同的 ID,而且相同 ID 背后存储的数据又完全不同...小结 数据库 ID 只适用于单机数据库环境,而对于分库、分表、数据分片来说, ID 不具备唯一性,所以要要使用雪花 ID 来替代数据库 ID

47810

关于mysqlid的获取和重置

缺点:获取的不是真正的id,是表中最大的Id,如果有删除数据的话,那么该值和id相差比较大。如果有连表数据,有可能导致数据错乱。...使用LAST_INSERT_ID函数:select LAST_INSERT_ID() 优点:获取到的是真正的id。 缺点:该函数是与table无关的,永远保留最新插入的增列的id。...使用mysql查询函数:SHOW TABLE STATUS; 优点:能够准确的查到id。而且可以在语句后面加上where语句或者like语句来过滤。...---- mysqlid的重置 使用truncate:truncate table; 说明:使用truncate删除表的数据释放空间,并且重置字id,但不会删除表的定义。...也不会清空数据,有可能会出现重复key的可能,所以此方法也只适用于清空表之后重置id或者大量删除后修改自id

11.5K20

MySQLid超大问题查询 转

问题排查 这张表是一个简单的接口服务在使用,每天大数据统计一大批信息,然后推送给小A,小A将信息更新到数据库中,如果是新数据就插入,旧数据就更新之前的数据,对外接口就只有查询了。...也就是说,上面的语句,跟REPLACE INTO ...类似的会将自ID加1,但实际记录没有加,这是为什么呢?...查了资料之后,小A得知,原来,mysql主键有个参数innodb_autoinc_lock_mode,他有三种可能只0,1,2,mysql5.1之后加入的,默认值是1,之前的版本可以看做都是0。...ON DUPLICATE KEY UPDATE ...的话,你会发现auto_increment并没有增加,因为这种模式直接加了AUTO_INC锁,执行完语句的时候释放,发现没有增加行数的话,不会增加...删除表的主键 删除主键,让唯一索引来做主键,这样子基本不用做什么变动,只要确定目前的主键没有实际的用处即可,这样的话,插入删除的时候可能影响效率,但对于查询多的情况来说,小A比较两种之后更愿意选择后者

5K20

技术分享 | 关于 MySQL ID 的事儿

当我们使用 MySQL 进行数据存储时,一般会为一张表设置一个主键,当有数据行插入时,该主键字段则会根据步长与偏移量增长(默认每次+1)。...的值并不是保存在表结构信息内的,对于不同的版本它们有如下的区别: 1.1.1 MySQL 8.0版本之前(重启后可能产生变化): 计数器的值存储在内存中的,重启后丢弃,下一次将读取最大的一个ID...且当 Binlog 模式为 statement(SBR)时 ID 不能保证数据的正确性 1.5 ID 一定就是连续吗?...不一定,业务也不应该过分依赖 MySQL ID 的连续性,在以下三种情况下,并不能保证 ID 的连续性: 1.5.1 插入时的其他唯一索引冲突 假设已存在数据{1,张三},且张三所属的字段设置了唯一主键...当我们为表设置了主键后, ID 的范围则与主键的数据类型长度相关。

3.2K10

mysql已存在的表增加字段

需求: 已有的mysql数据表,希望增加一个的字段,并设置新数据的初始值。 实际上不复杂,只是做个备忘。...新数据的起始值 /*增加一个主键字段,分两步操作*/ /*首先增加字段*/ alter table t_abc add column id int auto_increment primary...key; /*执行完上面这一条,字段增加,但值为空*/ /*执行这一条,它会自动为已存在的数据的字段赋初值,从1开始,同时将后续新增的数据从100开始*/ alter table t_abc auto_increment...key; /*这里没有指定任何数值,执行完后只为字段赋从1开始的初始值,其实隐含的设置当前表字段从1开始*/ alter table t_abc auto_increment; /*将所有数据增加...10000*/ update t_abc set id=id+10000; /* 前面的100 我们是任意指定的,现在我们应该指定数据库中的maxId+1作为下一个数据的起始值*/ set @maxId

11K10

面试官:数据库ID用完了怎么样?

这些都是题外话,只是告诉你数据量大了是有可能达到上限的而已,回到MysqlID上限的问题,可以分为两个方面来说。 1.有主键 如果设置了主键,并且一般会把主键设置成。...也就是说,如果设置了主键并且的话,达到主键上限就会报错重复的主键key。 解决方案,mysql主键改为bigint,也就是8个字节。...因为我们先设置row_id=1开始,所以1,2,3的row_id也是1,2,3。 修改row_id为上限值之后,row_id从0重新开始计算,所以4,5,6的row_id就是0,1,2。...总结 ID达到上限用完了之后,分为两种情况: 如果设置了主键,那么将会报错主键冲突。...如果没有设置主键,数据库则会帮我们自动生成一个全局的row_id,新数据覆盖老数据 解决方案: 表尽可能都要设置主键,主键尽量使用bigint类型,21亿的上限还是有可能达到的,比如魔兽,虽然说row_id

62310

面试官:数据库ID用完了怎么样?

这些都是题外话,只是告诉你数据量大了是有可能达到上限的而已,回到MysqlID上限的问题,可以分为两个方面来说。 1.有主键 如果设置了主键,并且一般会把主键设置成。...也就是说,如果设置了主键并且的话,达到主键上限就会报错重复的主键key。 解决方案,mysql主键改为bigint,也就是8个字节。...因为我们先设置row_id=1开始,所以1,2,3的row_id也是1,2,3。 修改row_id为上限值之后,row_id从0重新开始计算,所以4,5,6的row_id就是0,1,2。...总结 ID达到上限用完了之后,分为两种情况: 如果设置了主键,那么将会报错主键冲突。...如果没有设置主键,数据库则会帮我们自动生成一个全局的row_id,新数据覆盖老数据 解决方案: 表尽可能都要设置主键,主键尽量使用bigint类型,21亿的上限还是有可能达到的,比如魔兽,虽然说row_id

31730

mysql为什么建议使用主键

我们都知道表的主键一般都要使用 id,不建议使用业务 id ,是因为使用 id 可以避免页分裂。这个其实可以相当于一个结论,你都可以直接记住这个结论就可以了。...但是如果你要弄明白什么是页分裂,或者什么情况下页分裂,这个时候你就需要对 mysql 的底层数据结构要有一定的理解了。...如果主键为 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。...如果主键是非 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。...其实对主键 id 还有一个小小的要求,在满足业务需求的情况下,尽量使用占空间更小的主键 id,因为普通索引的叶子节点上保存的是主键 id 的值,如果主键 id 占空间较大的话,那将会成倍增加 mysql

4.9K31

MySQL主键为什么不连续

不同的引擎对于增值的保存策略不同: MyISAM引擎的增值保存在数据文件中 InnoDB引擎的增值保存在内存里,但是在MySQL8.0以后,该自增值才可以被持久化:MySQL5.7以前,增值没有持久化每次重启后第一次打开表的时候...,增值的最大值max(id),然后将最大值加1作为这个表的增值;MySQL8.0版本会将自增值的变更记录在redo log中,重启时依靠redo log恢复。...事务回滚为什么增值不能回退 两个并行的事务在申请增值的时候,为了避免两个事务申请到相同的id,需要加锁按照顺序申请,如果增值可以回退需要做一些特殊处理: 每次申请id之前,判断表里此id是否存在...(去主键索引树上判断该id是否存在) 把id的锁范围扩大,必须等到一个事务提交后才,下一个事务才可以申请id,锁粒度太大,系统并发能力极大下降 为了避免上述的性能消耗,InnoDB即使语句执行失败也不回退...,那就在需要的时候申请1个,如果有10w行数据那就需要申请10万次,对于批量插入数据的语句,MySQL有一个批量申请id的策略: 语句执行过程中,第一次申请id,分配1个 1个用完以后,第二次申请

8.4K20
领券