大厂MySQL设计规范3大核心要点
在大型互联网公司的 MySQL 开发设计中,规范的核心可以归纳为三大要点:表结构设计规范化、开发使用安全化、变更流程管控化。它们分别对应数据模型层、应用交互层、运维管理层的核心关注点。
一、表结构设计规范化:从命名到类型都要“克制”
大厂规范强调字段类型最小化、命名可读、强制必备字段,这是高性能和高可维护性的基础。
| 维度 | 规范要求 | 说明 |
|---|---|---|
| 命名 | 小写+下划线,不超过32字符,禁止拼音英文混用 | 例如表名 t_order,主键 order_id |
| 主键 | 统一使用 INT UNSIGNED AUTO_INCREMENT,禁止 UUID/MD5/HASH 作为主键 | 离散主键会导致页分裂、性能下降 |
| 字段类型 | 优先选择最小数据类型,整数用 TINYINT/INT/BIGINT UNSIGNED,金额用 DECIMAL | int(11) 的括号只是显示宽度,不是存储长度 |
| 必备字段 | 每张表必须有主键、create_time、update_time | 便于数据追踪和增量同步 |
| 字符集 | 默认 utf8,有 emoji 需求用 utf8mb4 | 避免乱码,且 utf8mb4 向下兼容 |
例如,大厂订单表通常这样设计:
-- 建表:体现大厂MySQL表结构设计规范
CREATE TABLE `t_order` (
`order_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`order_sn` VARCHAR(64) NOT NULL COMMENT '订单编号',
`total_amount` DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单总金额',
`status` TINYINT NOT NULL DEFAULT '0' COMMENT '订单状态:0待付款;1待发货;2已发货;3已完成;4已关闭;5无效订单',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`order_id`),
UNIQUE KEY `uk_order_sn` (`order_sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表';
这段代码体现了“见名知意、最小数据类型、必备字段、唯一约束”等核心规范。同时,DATETIME 比 TIMESTAMP 更推荐使用,因为 TIMESTAMP 取值范围到2038年,且 DATETIME 不随系统时区变化。
二、开发使用安全化:把“权限最小化”刻进日常
大厂非常重视数据库安全,尤其是敏感数据保护和账号权限控制。这不仅仅是 DBA 的事,而是每个研发都要遵守的底线。
| 安全维度 | 强制要求 | 原因 |
|---|---|---|
| 敏感数据 | 禁止明文存储密码、手机号、身份证、银行卡号 | 防止数据泄露造成重大事故 |
| 权限控制 | 程序账号只能访问一个DB,禁止跨库,禁止 DROP 权限 | 最小权限原则,限制爆炸半径 |
| 网络隔离 | 连接数据库使用内网域名,设置IP白名单 | IP变化时只需改DNS,杜绝非法IP接入 |
| 审计追踪 | 敏感操作必须有审计日志,重要SQL做访问频率监控 | 便于事后追溯和发现异常行为 |
举个例子,手机号不能明文存储,可以“先Base64再AES加密”或“中间四位加星”脱敏后存储。文件图片也不能存入数据库,应放OSS等文件系统。程序账号和人工账号必须分离,线上人工账号仅授予查询权限,写权限仅限指定人员,且不能分配 DROP、TRUNCATE 等权限。
这一点也符合 MySQL 三级模式结构中外模式(视图与权限控制)的思想:通过视图限制用户只能看到允许的数据,通过权限模型控制访问粒度,从而保障逻辑独立性。权限设计不仅是为了安全,更是为了让数据库在多人协作下依然稳定可靠。
三、变更流程管控化:任何线上变更都要有“刹车”
第三个核心要点是“流程规范”,尤其针对线上数据库的变更。大厂普遍规定:建表必须先确定索引;大表结构变更必须用 pt-online-schema-change 在低峰期执行;线上变更必须有回滚方案;批量更新前必须先 SELECT 确认。
| 场景 | 规范要求 |
|---|---|
| 大表加字段 | 禁止直接 ALTER TABLE,使用 pt-online-schema-change 避免锁表 |
| 批量更新/删除 | 需DBA审查,避开业务高峰期,执行中监控服务状态 |
| 数据订正 | 先 SELECT 确认,再执行 UPDATE/DELETE,避免误操作 |
| 回滚方案 | 所有线上数据库变更必须提供回滚方案 |
以一个批量修改订单状态为例,规范做法是先查询确认再更新:
-- 1. 先查询确认要影响的数据量,避免误操作
SELECT order_id, status, update_time
FROM t_order
WHERE status = 0 AND create_time < '2025-01-01';
-- 2. 确认无误后,在低峰期分批更新,避免大事务造成主从延迟
UPDATE t_order
SET status = 5, update_time = NOW()
WHERE status = 0 AND create_time < '2025-01-01'
AND order_id BETWEEN ? AND ?;
上述代码体现了“先查后改”、“分批处理”和“低峰执行”的规范。大厂拒绝大SQL、大事务、大批量,因为大批量会造成主从延迟,binlog为row格式时会产生大量日志。
总结
大厂 MySQL 设计规范的核心不在于“禁止”本身,而在于通过结构、权限、流程三层防线,让数据库在高并发、大数据量场景下依然可控、可维护、可追溯。对研发人员来说,遵循“类型克制、权限最小、变更审慎”这三条主线,就能有效规避绝大部分线上故障。


被折叠的 条评论
为什么被折叠?



