MySQL建表规范
建表规范是数据库设计的基础,良好的表结构能提升查询性能、减少存储空间、降低维护成本。
适用场景:新项目建表、表结构评审、数据库设计文档编写。
核心要点
MySQL数据库建表规范,包括命名规范、数据类型选择、索引设计
强制规则
表达是与否概念的字段,必须使用
is_xxx方式命名,数据类型是unsigned tinyint(1表示是,0表示否)表名、字段名必须使用小写字母或数字,禁止数字开头,禁止两个下划线中间只出现数字
- 正例:
aliyun_admin、rdc_config、level3_name - 反例:
AliyunAdmin、rdcConfig、level_3_name - MySQL 在 Linux 下默认区分大小写
- 正例:
表名不使用复数名词,表名应表示实体内容而非数量
禁用保留字,如
desc、range、match、delayed等主键索引名为
pk_字段名;唯一索引名为uk_字段名;普通索引名为idx_字段名小数类型为
decimal,禁止使用float和double(存在精度损失)字符串长度几乎相等时使用
char定长字符串类型varchar长度不要超过 5000;超过此值定义为text,独立一张表- 原因:InnoDB 单行所有列的总字节数上限为 65535(utf8mb4 下 varchar 按 4 字节/字符计),超长字段会挤占其他列的空间,且行溢出后反而影响性能;
text单独存储,正文内容只在查询时按需读取
- 原因:InnoDB 单行所有列的总字节数上限为 65535(utf8mb4 下 varchar 按 4 字节/字符计),超长字段会挤占其他列的空间,且行溢出后反而影响性能;
表必备三字段:
id:必为主键,类型bigint unsigned,单表自增、步长为 1create_time:datetime 类型update_time:datetime 类型
推荐规则
表命名遵循"业务名称_表的作用",如
alipay_task、trade_config库名与应用名称尽量一致
修改字段含义或状态追加时,及时更新字段注释
字段允许适当冗余提高查询性能,但必须考虑数据一致性。冗余字段应遵循:
- 不是频繁修改的字段
- 不是唯一索引的字段
- 不是 varchar 超长字段,更不能是 text 字段
单表行数超过 500 万行或容量超过 2GB,才推荐分库分表
字段类型选择
| 对象 | 年龄区间 | 类型 | 字节 | 表示范围 |
|---|---|---|---|---|
| 人 | 150岁之内 | tinyint unsigned | 1 | 0-255 |
| 龟 | 数百岁 | smallint unsigned | 2 | 0-65535 |
| 恐龙化石 | 数千万年 | int unsigned | 4 | 0-约43亿 |
| 太阳 | 约50亿年 | bigint unsigned | 8 | 0-约10^19 |
建表语句示例
CREATE TABLE example_task (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
is_deleted TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除:0-否,1-是',
task_name VARCHAR(100) NOT NULL COMMENT '任务名称',
task_desc TEXT COMMENT '任务描述',
task_status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '任务状态:0-待办,1-进行中,2-完成',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_task_name (task_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务表';注:
task_name只保留唯一索引(唯一索引本身已具备索引加速能力),避免同一字段重复建索引;状态类字段用tinyint而非decimal——decimal是定点小数,用于金额等精确数值,不用于枚举状态。