MySQL 的整数类型有哪些?一文彻底搞懂整数存储原理
📌 MySQL 的整数类型有哪些?一文彻底搞懂整数存储原理
👉 INT 和 BIGINT 如何选择?
👉 为什么主键一般使用 BIGINT?
👉 TINYINT(1) 为什么经常表示布尔值?
👉 INT(11) 中的 11 是什么意思?
👉 UNSIGNED 有什么作用?
很多人往往回答不完整。
实际上,MySQL 整数类型不仅涉及存储空间,还涉及取值范围、无符号设计、自增主键、索引效率以及分库分表架构设计。
🎯 1️⃣ 问题背景
数据库设计过程中,字段类型的选择直接影响存储空间、索引效率以及系统扩展能力。
例如用户表中的年龄字段使用 BIGINT 显然是一种浪费,而订单表中的主键如果使用 INT,则可能在高并发业务中很快达到上限。
因此理解 MySQL 整数类型的存储原理,是数据库设计的基础能力。
🚀 2️⃣ 核心原理
MySQL 整数类型本质上是按照固定字节数存储二进制数据。
字节数越大,可表示的数值范围越大。
整数类型主要分为:
- TINYINT
- SMALLINT
- MEDIUMINT
- INT(INTEGER)
- BIGINT
其核心规律非常简单:
↓
可表示数字范围越大
↓
占用磁盘和内存越多
📊 3️⃣ 数据结构分析
整数类型存储空间对比
| 类型 | 字节数 | 有符号范围 | 无符号范围 |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
| INT | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
| BIGINT | 8 | 约 ±9.22×10¹⁸ | 约 1.84×10¹⁹ |
UNSIGNED 无符号设计
默认情况下整数类型是有符号的。
最高位用于表示正负号。
如果指定 UNSIGNED,则全部位数都用于存储数值。
INT 最大值: 2147483647
INT UNSIGNED 最大值: 4294967295
容量直接翻倍。
🔥 4️⃣ 算法分析
为什么范围是 2 的幂次?
因为整数底层采用二进制存储。
n 个 bit 可以表示:
2ⁿ 个状态。
例如:
- 1 Byte = 8 Bit
- 2⁸ = 256
- TINYINT 可表示 256 个状态
有符号整数需要拿出最高位表示符号位:
- 0 表示正数
- 1 表示负数
因此:
- 正数范围:0 ~ 127
- 负数范围:-128 ~ -1
INT(11) 的 11 是什么?
这是 MySQL 面试中的高频问题。
INT(11) 可以存储 11 位数字。
INT(11) 的 11 表示显示宽度(Display Width)。
不影响存储空间。
不影响取值范围。
INT(1) 和 INT(11) 都占用 4 个字节。
MySQL 8.0 开始已经废弃显示宽度概念。
⚙️ 5️⃣ 执行流程
插入整数的存储过程
↓
MySQL解析SQL
↓
根据字段类型检查范围
↓
转换为二进制
↓
写入InnoDB页
↓
刷盘持久化
例如:
插入数据:
MySQL 会根据字段定义选择对应字节数进行存储。
💡 6️⃣ 实际案例
案例一:年龄字段
年龄通常不会超过 150。
因此使用:
范围:
0 ~ 255
完全满足需求。
案例二:订单表主键
订单量达到亿级以后:
INT 最大值: 2147483647
只有约 21 亿。
大型互联网系统几年内就可能耗尽。
因此通常设计为:
或者:
案例三:状态字段
订单状态:
- 0:待支付
- 1:已支付
- 2:已发货
- 3:已完成
只需要:
即可满足需求。
✅ 7️⃣ 优缺点分析
小整数类型优势
- 节省磁盘空间
- 节省内存
- 索引占用更小
- B+树层级更低
- 查询效率更高
大整数类型优势
- 容量大
- 扩展性强
- 适合分布式ID
- 适合雪花算法ID
缺点
- 字段越大占用空间越多
- 索引页能存放的数据越少
- 缓存命中率降低
- 网络传输成本增加
🎯 8️⃣ 面试常见问题
Q1:INT 和 BIGINT 如何选择?
数据量预计不超过 20 亿使用 INT。
订单、用户、分布式ID一般使用 BIGINT。
Q2:为什么互联网项目主键喜欢用 BIGINT?
因为雪花算法生成的是 64 位整数,同时避免主键过早达到上限。
Q3:INT(11) 占用 11 个字节吗?
不是。
INT 永远占用 4 字节。
11 只是显示宽度。
Q4:TINYINT(1) 为什么经常表示 Boolean?
因为只需要存储:
- 0 = false
- 1 = true
很多 ORM 框架会自动映射成 Boolean。
Q5:为什么能不用 BIGINT 就不要用 BIGINT?
字段越大,索引越大。
索引越大,B+树层级越高。
查询效率会下降。
📌 9️⃣ 总结
✅ TINYINT:1 字节,适合状态、年龄、布尔值。
✅ SMALLINT:2 字节,适合中小范围数值。
✅ MEDIUMINT:3 字节,使用较少。
✅ INT:4 字节,大部分业务字段首选。
✅ BIGINT:8 字节,适合订单ID、用户ID、雪花ID。
✅ UNSIGNED 可以将容量提升一倍。
✅ INT(11) 不代表存储 11 位数字,只是显示宽度。
✅ 数据库设计原则:
够用即可。
不要盲目使用 BIGINT。
也不要因为节省空间而导致字段容量不足。
面试中如果被问到 MySQL 整数类型,除了背诵五种整数类型外,更重要的是能够结合存储空间、索引结构、主键设计以及互联网高并发场景进行分析,这才是真正的高级工程师思维。
相关文章
-
MySQL 的整数类型有哪些?一文彻底搞懂整数存储原理
面试中如果被问到 MySQL 整数类型,除了背诵五种整数类型外,更重要的是能够结合存储空间、索引结构、主键设计以及互联网高并发场景进行分析,这才是真正的高级工程师思维。
NEW个对象 2026-06-14