命名规范
- 库名、表名、字段名必须使用小写字母,并采用下划线分割
- 库名、表名、字段名禁用超过32个字符。须见名知意
- 库名、表名、字段名禁用使 MySQL保留字
- 临时库、表名必须以tmp为前缀,并以日期为后缀
- 备份库、表必须以bak为前缀,并以日期为后缀
基础规范
- 使用INNODB存储引擎
- 表字符集使用utf8mb4
- 所有表都需要添加注释
- 单表数据量建议控制在5000W以内
- 不在数据库中存储图片、文件等大数据
- 禁止在线上做数据库压力测试
- 禁止从测试、开发环境直连数据库
库表设计
- 禁止使用分区表
- 拆分大字段和访问频率低的字段,分离冷热数据
- HASH进行散表,表名后缀使用十进制数,下标从0开始
- 按日期时间分表需符合YYYY[MM][DD][HH]格式
- 采用合适的分库分表策略。例如千库十表、十库百表等
字段设计
- 尽可能不使用TEXT、BLOB类型
- DECIMAL代替FLOAT和DOUBLE存储精确浮点数
- Simple is good
- 将字符转化为数字
- 使用TINYINT来代替ENUM类型
- Generosity can be unwise
- 存储 “hello”时VARCHAR(5) VS VARCHAR(200)
- Avoid null if possible
- 所有字段均定义为NOT NULL ! Smaller is usually better
- 使用UNSIGNED存储非负整数
- INT类型固定占用4字节存储
- 使用timestamp存储时间
- 使用INT UNSIGNED存储IPV4
- 使用VARBINARY存储大写敏感的变 字符串
- 禁用在数据库中存储明文密码
索引规范
索引的用途
索引数量控制
- 单张表中索引数量不超过5个
- 单个索引中的字段数不超过5个
- 对字符串使用前缀索引,前缀索引长度不超过8个字符
- 建议优先考虑前缀索引,必要时可添加伪列并建立索引
主键准则
- 表必须有主键
- 不使用更新频繁的列
- 尽量不选择字符串列
- 不使用UUID MD5 HASH
- 默认使用非空的唯一键
- 建议选择自增或发号器
重要的SQL必须被索引
- UPDATE、DELETE语句的WHERE条件列
- ORDER BY、GROUP BY、DISTINCT的字段
- 多表JOIN的字段
区分度最大的字段放在前
核心SQL优先考虑覆盖索引
避免冗余和重复索引
索引不是越多越好