Yihui’s Blog

MySQL 在设计表(建表)时需要注意什么?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #表设计 #数据库设计 #VIP

一句话答案

建表要围绕业务不变量和查询模式,合理设计主键、字段类型、NULL 与默认值、约束和索引,并提前考虑字符集、时间金额、数据增长、冷热归档、审计与迁移成本。

面试口语版

我先从领域模型和访问模式出发,不为“范式漂亮”脱离业务。主键优先短、稳定、非业务可变值;字段选能覆盖范围的最小合理类型,金额用 DECIMAL,时间明确时区,字符串长度按领域约束,统一 utf8mb4 和排序规则。能由数据库保证的不变量用 NOT NULL、唯一索引或约束表达。索引根据 WHERE、JOIN、ORDER BY 设计联合索引,避免重复和过多索引。大字段、冷热数据和高增长表要考虑拆分、归档与分区边界;同时保留 created_at、updated_at 等审计字段,并评估在线 DDL 和未来扩容。

原理拆解

维度检查项
主键短、稳定、唯一,评估自增或分布式 ID
字段类型、长度、NULL、默认值、单位与时区
约束唯一性、检查约束、关系完整性
索引匹配查询、控制数量、避免重复
生命周期增长率、归档、逻辑删除、大字段
运维字符集、DDL、备份、审计、权限

关键细节

  • 不要用字符串保存结构化数字、时间或逗号分隔列表。
  • 主键越宽,InnoDB 所有二级索引通常也越大。
  • 默认值必须有业务含义,避免用 0 或空串混淆“未知”和真实值。
  • 表和列注释、命名规范能显著降低长期沟通成本。

面试官追问

  1. 为什么不建议 UUID 字符串直接做聚簇主键?
  2. NULL 与默认值如何选择?
  3. 联合索引字段顺序怎么设计?
  4. 分区能替代分库分表吗?

高分补充

优秀表设计不是一次定稿,应以增长模型和迁移能力为约束,确保未来变化可在线演进。

学习清单

  • 用主键、字段、约束、索引、生命周期、运维六项做建表评审。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts