社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

老板问:MySQL的自增 ID 用完了,怎么办?我感觉能用几千年!!!

菜鸟教程 • 11 月前 • 221 次点击  
MySQL 自增 ID 一般用的数据类型是 INT 或 BIGINT,正常情况下这两种类型可以满足大多数应用的需求。
当然也有不正常的情况,当达到其最大值时,尝试插入新的记录会导致错误,错误信息类似于:
ERROR 167 (22003): Out of range value for column 'id' at row 1
下面我们就来看看  INT 或 BIGINT 到底能插入多少的数据。

1、INT 
INT 类型占用 4 个字节,范围:-2,147,483,648 到 2,147,483,647(如果是无符号类型,则范围是 0 到 4,294,967,295
也就是说 INT 类型存储量将近可以达到 43 亿,看着数量,感觉可以存储很多条记录了,我们就来计算下:
一年 365 天一天 24 小时一小时 60 分钟一分钟 60 秒如果每秒钟存储 100 条记录看看能用多久:
# INT 的最大值max_int_value =  4294967295
# 每秒记录数records_per_second = 100
# 每年的秒数records_per_year = 365 * 24 * 60 * 60result = max_int_value/(records_per_second * records_per_year)
print(result)# 结果:1.3619251950152207
结果就为 1.3619251950152207也就是能存储 1 年多的时间,看来确实不太够,使用 INT 类型,如果数据量过多,自增 ID 很容超过最大数值。

2、BIGINT
BIGINT 占用 8 个字节,范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(如果是无符号类型,则范围是 0 到 18,446,744,073,709,551,615
假如公司是我家,我准备在公司呆个 100 年,我们来计算下 BIGINT 使用 100 年支持每秒插入多少数据。

BIGINT 类型的最大值:

无符号 BIGINT 类型的最大值为18,446,744,073,709,551,615。

计算 100 年的秒数:
100×365天/年×24小时/天×60分钟/小时×60秒/分钟 = 3,153,600,000
# BIGINT 的最大值max_bigint = 18446744073709551615
# 100年的秒数seconds_in_100_years = 365*24*60*60*100
# 计算结果result = max_bigint / seconds_in_100_years
print(result)# 结果:5849424173.55072
结果为 5849424173.55072  相当于每秒钟插入 58 亿的数据,这样的数据双十一都不知有没达到,我用 AI 查找了下淘宝双十一历史的最大并发生:
这样看,我如果使用 BIGINT,在公司干个 100 年完全没问题,即便公司能活 100 年,老板也活不过 120+(假设老板 20 岁出来继承家业),也就是即便我把老板送走,都达不到最大的值。
所以我们只要把自增 ID 设置为 BIGINT 类型,你根本就不用担心自增 ID 会用完,而是要担心公司能不能活的比 BIGINT 更长。
总结:INT 类型在大多数情况下足够使用,当需要更大的数值范围时,可以考虑使用 BIGINT 类型。
如果你的自增 ID 是 INT  类型,要修改 INTBIGINT 可以使用 ALTER 命令:
-- 创建表CREATE TABLE orders ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, order_data VARCHAR(255));-- 查看表结构DESCRIBE orders;-- 修改自增列的数据类型ALTER TABLE orders MODIFY id BIGINT UNSIGNED AUTO_INCREMENT;-- 再次查看表结构,确认修改DESCRIBE orders;

注意事项

  1. 备份数据:在进行表结构修改之前,最好备份数据,以防止操作过程中出现意外情况。
  2. 锁表:在修改表结构时,表可能会被锁定,导致短暂的写操作中断。尽量在业务低峰期进行操作。
  3. 外键约束:如果有外键约束涉及到要修改的列,需要先删除相关外键约束,修改列类型后再重新添加外键约束。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/170646
 
221 次点击