首页 > 项目 > 当前页面

MySQL 的整数类型有哪些?一文彻底搞懂整数存储原理

2026-06-14 NEW个对象

📌 MySQL 的整数类型有哪些?一文彻底搞懂整数存储原理

很多开发人员只知道 MySQL 有 TINYINT、INT、BIGINT 等整数类型,但在面试中如果被问到:

👉 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:

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页

刷盘持久化

例如:

CREATE TABLE user( id BIGINT PRIMARY KEY, age TINYINT, score INT );

插入数据:

INSERT INTO user VALUES (10000000001,18,95);

MySQL 会根据字段定义选择对应字节数进行存储。

💡 6️⃣ 实际案例

案例一:年龄字段

年龄通常不会超过 150。

因此使用:

age TINYINT UNSIGNED

范围:

0 ~ 255

完全满足需求。

案例二:订单表主键

订单量达到亿级以后:

INT 最大值: 2147483647

只有约 21 亿。

大型互联网系统几年内就可能耗尽。

因此通常设计为:

id BIGINT

或者:

Snowflake 生成的 BIGINT

案例三:状态字段

订单状态:

  • 0:待支付
  • 1:已支付
  • 2:已发货
  • 3:已完成

只需要:

status TINYINT

即可满足需求。

✅ 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 整数类型,除了背诵五种整数类型外,更重要的是能够结合存储空间、索引结构、主键设计以及互联网高并发场景进行分析,这才是真正的高级工程师思维。

相关文章

NEW个对象 NEW个对象
JAVA是世界上最好的语言