建表语句是什么
建表语句定义列、类型、约束、索引与表选项,是数据模型落到存储的起点。稳妥的默认组合是 InnoDB 引擎加 utf8mb4 字符集,兼顾事务与四字节字符。真正决定后续性能的是主键设计:InnoDB 的主键就是聚簇索引,数据按主键顺序存放,主键选得不好,插入与查询代价都会持续上升。
基本信息
| 用途 | 定义表结构、约束与索引 |
|---|---|
| 核心要素 | 列类型、非空约束、默认值、主键、索引、引擎与字符集 |
| 推荐组合 | InnoDB 加 utf8mb4 |
| 主键要点 | 主键即聚簇索引,决定数据物理顺序 |
| 金额类型 | 用定点小数,避免浮点误差 |
| 时间类型 | 日期时间类型不随时区转换,时间戳类型会随会话时区变化 |
典型使用场景
- 新业务建模:确定表结构与主键
- 分表拆分:按同一模板批量建表
- 归档表:结构与主表保持一致,便于数据搬迁
- 日志与流水表:按时间维度设计索引
- 测试环境复制结构:只建结构不导数据
完整示例
完整示例
CREATE TABLE orders (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NOT NULL,
sku VARCHAR(64) NOT NULL,
qty INT NOT NULL DEFAULT 1,
amount DECIMAL(12,2) NOT NULL DEFAULT 0.00,
status TINYINT NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_user_created (user_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; # 引擎与字符集显式写出复制结构与查看
复制结构与查看
SHOW CREATE TABLE orders\G # 拿到完整定义,含索引与表选项
CREATE TABLE orders_bak LIKE orders; # 只复制结构,索引一并带上设计要点
| 项目 | 推荐做法 | 原因 |
|---|---|---|
| 主键 | 使用有序且紧凑的类型 | 主键即聚簇索引,随机主键造成页分裂 |
| 金额 | 使用定点小数 | 浮点有精度误差,对账会出问题 |
| 时间 | 需要时区转换时用时间戳类型 | 日期时间类型不随会话时区变化 |
| 字符集 | 统一使用 utf8mb4 | 四字节字符不会写入失败 |
| 字符串长度 | 按业务实际需求设定 | 过长浪费内存,过短会截断或报错 |
| 默认值 | 给非空列配默认值 | 避免写入时因缺值报错 |
金额用定点小数而不是浮点:浮点在累加与比较时带误差,财务对账必然出问题,这是数据模型阶段代价最高的返工之一。
主键避免用随机字符串:随机主键会让插入位置分散,引发页分裂与索引膨胀,用有序且短的类型更划算。
字符串长度要按需设置:过小会导致写入截断或报错,过大则浪费内存——临时表与排序内存按最大长度分配,宽字段会显著放大内存开销。
建表检查清单
- 显式写出引擎与字符集,不依赖服务端默认值
- 主键类型与业务增长量匹配
- 为常用查询条件预留复合索引
- 字段注释写清含义,便于后续维护
- 上线前用真实数据量评估表大小与索引数量
表结构一旦承载数据,改动成本就明显上升:加列通常较容易,改列类型与主键往往需要重建表,因此建模阶段多花半小时核对,能省掉后期数小时的停机改造。