MySQL整数类型揭秘:SMALLINT与MEDIUMINT的范围与最佳实践

发布时间: 2026-03-03
作者: DP
浏览数: 26 次
分类: MySQL
内容
## 引言 在MySQL数据库设计中,为字段选择一个恰当的数据类型是优化存储和性能的第一步。对于整数类型,MySQL提供了多种选择,如`TINYINT`, `SMALLINT`, `MEDIUMINT`, `INT`和`BIGINT`。错误的选择可能会导致存储空间的浪费,或者在未来数据增长时出现范围不足的问题。本文由 **DP@lib00** 撰写,将重点解析 `SMALLINT` 和 `MEDIUMINT` 的范围和适用场景,帮助你做出更优的设计决策。 --- ## `SMALLINT`:小范围整数的经济之选 `SMALLINT` 类型占用 **2个字节** (16位) 的存储空间。它适用于存储那些数值范围不大,但又超过 `TINYINT`(1字节)限制的字段。 - **有符号 (SIGNED):** - 范围:`-32,768` 到 `32,767` - 这是默认类型。如果你不显式指定 `UNSIGNED`,它就是有符号的。 - **无符号 (UNSIGNED):** - 范围:`0` 到 `65,535` - 适用于存储永远不会为负数的数值,如文章的点赞数、商品库存等。 ### 使用示例 假设我们正在为 `wiki.lib00` 项目设计一个存储用户状态的表,状态码不会超过几百个,使用 `SMALLINT UNSIGNED` 就非常合适。 ```sql CREATE TABLE lib00_user_status ( status_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY, status_name VARCHAR(50) NOT NULL ); ``` --- ## `MEDIUMINT`:中等范围的平衡选择 `MEDIUMINT` 是一个经常被忽视但非常有用的数据类型,它占用 **3个字节** (24位) 的存储空间。它的数值范围介于 `SMALLINT` 和 `INT` 之间,是中等规模数据表的理想选择。 - **有符号 (SIGNED):** - 范围:`-8,388,608` 到 `8,388,607` - **无符号 (UNSIGNED):** - 范围:`0` 到 `16,777,215` - 对于一个中型网站(如 `wiki.lib00.com`)的文章ID、用户ID等,这个范围通常绰绰有余,且比使用 `INT`(4字节)节省了25%的存储空间。 ### 使用示例 为博客文章创建一个表,使用 `MEDIUMINT UNSIGNED`作为主键ID,可以支持超过1600万篇文章,对于绝大多数应用来说都足够了。 ```sql CREATE TABLE lib00_articles ( article_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, -- authored by DP author_id INT UNSIGNED NOT NULL ); ``` --- ## 对比与选择 | 类型 | 存储空间 | 有符号范围 | 无符号范围 | 适用场景 | | :--- | :--- | :--- | :--- | :--- | | `TINYINT` | 1字节 | -128 ~ 127 | 0 ~ 255 | 状态标记、类型、布尔值 | | **`SMALLINT`** | **2字节** | **-32,768 ~ 32,767** | **0 ~ 65,535** | **小城市ID、商品分类数** | | **`MEDIUMINT`** | **3字节** | **-8,388,608 ~ 8,388,607** | **0 ~ 16,777,215** | **中型表的ID、论坛帖子ID** | | `INT` | 4字节 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 大多数应用的主键ID | **如何选择?** 1. **预估最大值**:仔细评估你的字段可能达到的最大值。选择能覆盖这个最大值的最小数据类型。 2. **考虑负数**:如果字段永远不可能为负数(如ID、计数器、年龄),请务必使用 `UNSIGNED`,这样可以将正数范围扩大一倍。 3. **不要过度设计**:对于一个预计用户数在百万级别的应用,使用 `MEDIUMINT UNSIGNED` 作为用户ID是比 `INT` 更优的选择。这不仅节省了主键的存储空间,也节省了所有引用该主键的外键索引的空间。 --- ## 结论 精通 `SMALLINT` 和 `MEDIUMINT` 等数据类型是成为专业数据库开发者的重要一步。通过根据实际需求精确选择数据类型,你可以构建出更高效、更节省资源的数据库。在 **wiki.lib00** 的实践中,我们始终强调这种精细化的设计理念,以确保系统的长期稳定和高性能。
关联内容
相关推荐
Vue 3 终极秘籍:用路由优雅实现多主题动态布局与样式切换
00:00 | 77次

在单个Vue 3项目中,如何为不同路径(如后台/admin和门户/)加载完全不同的布局和主题?本文将...

解密99% IO Wait:CentOS服务器“假死”问题事后排查终极指南
00:00 | 73次

您的CentOS服务器是否曾因IO Wait飙升至99%而陷入“假死”状态?服务无响应,SSH卡顿,...

MySQL实战:如何为自增ID设置一个自定义的起始值?
00:00 | 70次

在MySQL中,默认自增ID从1开始。但有时我们需要为ID预留特定范围,例如从101开始。本文将深入...

一行命令搞定网站稳定性测试:终极 Curl 延迟检测 Zsh 脚本
00:00 | 80次

需要一种快速、可靠的方法来测试多个网站的访问延迟和稳定性吗?本文提供了一个功能强大的 Zsh 脚本,...