当MySQL的int不够用了

关于int的长度

  • 很多时候看到int(8)这样的定义,其实这是工具导出的不专业。

  • int是范围,不是长度。

  • 在开发有了共识(知道这个长度不算数,要看范围)以后,上来就是所有的类型都是bigint。

int的范围

  • int的取值范围是
  • TINYINT:占用1个字节(8位),取值范围是-128到127(有符号),或者0到255(无符号)。
  • SMALLINT:占用2个字节(16位),取值范围是-32,768到32,767(有符号),或者0到65,535(无符号)。
  • MEDIUMINT:占用3个字节(24位),取值范围是-8,388,608到8,388,607(有符号),或者0到16,777,215(无符号)。
  • INT 或 INTEGER:占用4个字节(32位),取值范围是-2,147,483,648到2,147,483,647(有符号),或者0到4,294,967,295(无符号)。
  • BIGINT:占用8个字节(64位),取值范围是-9,223,372,036,854,775,808到9,223,372,036,854,775,807(有符号),或者0到18,446,744,073,709,551,615(无符号)。
  • 总之占位字节越多,性能就越不好。所以都是bigint不太合适

我个人建议

  • MySQL的表,如果要自增ID当主键的,那么就是用int就行。可以放21亿条数据。现如今99.99%的系统中的数据表没这么多数据。如果想再多一点用无符号的,那么就能扩大到42亿条数据。现如今99.9999%的系统中的数据表没这么多数据。
  • 问题来了,如果一开始没设置无符号,到了21亿的范围会如何?
  • 答案是写不进去了。
  • 追问,这个时候改还来得及吗?
  • 答案是,可以。

实操测试

  • 在MySQL中当列有数据库的时候改类型是可以的。(不是所有都这样,Oracle就不允许)

  • 在b列有数据的时候改类型。成功。

  • 在这个基础上给id列写入最大值以及模拟越界。

  • 可以看出,在2147483647的时候还可以写入。但是到了2147483648的时候不行了。

  • 这时候把int列改成无符号型,又可以写入了。理论写入42亿条。

相关推荐
名誉寒冰13 小时前
MySQL索引原理解析:为什么选择B+树?
数据库·b树·mysql
我是苏苏13 小时前
Redis开发07:使用stackexchange.redis库实现简单消息队列
数据库·redis·缓存
煎蛋学姐13 小时前
SSM装修服务网站5ff59(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架
云心雨禅14 小时前
WordPress提速指南:Memcached+Super Static Cache+CDN缓存网站内容
linux·服务器·数据库·缓存·memcached
Mr.wangh15 小时前
Redis主从复制
java·数据库·redis
穿背心的程序猿15 小时前
推荐一款集成AI功能的数据库管理工具
数据库
柱子jason16 小时前
使用IOT-Tree消息流【标签读写】功能详细说明
数据库·物联网·时序数据库·influxdb·iot-tree
鲲志说16 小时前
电子证照系统国产化改造实践:从MongoDB到金仓数据库的平滑迁移与性能优化
大数据·数据库·mongodb·性能优化·数据库开发·数据库架构·金仓数据库
范纹杉想快点毕业17 小时前
单片机开发中的队列数据结构详解,队列数据结构在单片机软件开发中的应用详解,C语言
c语言·数据库·stm32·单片机·嵌入式硬件·mongodb·fpga开发
William_cl18 小时前
【连载2】 MySQL 事务原理详解
数据库·mysql