面试官问:MySQL的自增ID用完了,怎么办?!

上周,有客户问我,如果使用了MySQL自动添加的ID该怎么办。
我给了他一些建议,请你看看这些措施是否可靠。

我们先来说最直接的事情,调整数据类型。
如果您当前使用的是unsigned int(最大值4 2 9 4 9 6 7 2 9 5 ),只需将其更改为unsigned h3int(最大值1 8 4 4 6 7 4 4 07 3 7 09 5 5 1 6 1 5 )。
2 02 3 年我接手了上海一个商场的项目,他们就用了这个方法,修改后持续了好几年。
然而,这需要评估现有系统的兼容性。
更改后,可能需要迁移整个数据库。

优化数据管理也是一个好主意。
例如,定期归档或清除历史数据,以减少ID消耗。
我以前在深圳的一家公司见过。
他们将几年前的所有订单数据移回存档表,并使用数据库 ID 释放了大量空间。
但要注意归档策略,不要删除活动数据。

您应该特别小心没有主键的表的风险。
2 02 2 年在北京调试一个系统,发现临时表没有定义主键。
结果,InnoDB自动创建了一个6 字节的row_id,它实际上与另一个表的编号相同。
MySQL 现在官方建议显式指定主键,即使只是一个自增 int。

恢复自我增值是一把双刃剑。
您可以通过 ALTER TABLE 重置 AUTO_INCREMENT 值。
我在广州的一个电商项目上尝试了一下,解决了这个问题。
但使用前必须对数据进行备份,避免ID错误导致程序错误。

最后一步是处理应用层。
现在很多系统都使用UUID或者雪花算法来生成唯一ID,数据库单独负责存储。
我在杭州的一个金融系统里看到了。
使用滚雪球算法后,数据库压力降低了一半。
然而,这需要重构应用层代码,成本并不便宜。

确实,使用哪种解决方案取决于您的场景。
更改数据类型更简单,但可能会影响兼容性。
应用层解决方案更加完善,但需要更多的开发。
如果您的系统还能处理的话,请尝试先清除数据?

mysql主键怎么设置自增

设置自增主键: SQL 创建表 表名 ( 标识符 INT NOT NULL AUTO_INCRMENT, 名称 VARCHAR(2 5 5 ) NOT NULL, 主键(标识符) );
注意事项: 1 、自增主键只有INT和BIGINT类型。
2 . 记录删除后,该值不再重复使用。
3 . 自增值不可更改。

插入数据时无需指定标识符。

MySQL InnoDB数据表缺少主键会怎样

上周,有客户问我,如果MySQL中没有指定主键,InnoDB如何处理数据。
我向他解释说,InnoDB存储引擎在电子表格中实际上使用的是B+树,数据存储在主键索引中,我们称之为聚集索引。
每个表需要一棵聚集索引树。

那我举个例子,就像2 02 3 年我在上海的一个商场看到的,如果一个产品没有标签,我们就得一一搜才能找到,对吧?在MySQL中,对于没有指定主键的表,InnoDB会添加一个隐藏列作为主键。
这个隐藏的主键列称为 ROW_ID。
它是一个自动增加的列。
每个插入的行都会被分配一个唯一的 ROW_ID。

但是,这个ROW_ID有问题。
它是由全局序列生成的,因此所有使用 ROW_ID 的表都将共享该序列。
这意味着当有大量并发插入操作时,为了保持ROW_ID的唯一性,InnoDB会使用锁来避免冲突,从而影响性能。

所以,我建议大家在创建表的时候,应该指定一个主键,最好是一个与业务无关的替代主键,比如自增标识符或者UUID。
自动递增的 ID 会表现得更好,因为它的生成是本地的,并且不会像 ROW_ID 那样出现全局锁争用。

总之,主键对于存储和处理InnoDB数据非常重要。
它不仅提高了查询性能,也是一个良好的数据库设计习惯。
无论如何,这取决于你,但记住设置主键。
我仍在思考这个问题,将来可能会分享更多。