建表规范
存储引擎:
- 表的存储引擎必须选择InnoDB
- 每一个Innodb表都必须要有主键
字符集:
- 表的字符集都选择utf-8
- 如果有需要存储emoji可以使用utf8mb4
索引:
- 单表的索引个数最好不要超过5个
- 尽量使用复合索引,而不是添加新的索引
- 不要在索引列上使用数学运算和函数运算
- 注意组合索引的顺序,以便利用索引的最左原则
字段:
- 一张表的字段个数最好不要超过50个
- 所有表和字段都需要添加中文注释
- 用DECIMAL代替FLOAT和DOUBLE存储精确浮点数
- 使用TINYINT来代替ENUM类型
- 字段长度尽量按实际需要进行分配,不要随意分配一个很大的容量
- 字段定义为NOT NULL要提供默认值
- 尽可能不使用TEXT、BLOB类型
- 每张表数据量建议控制在5000W以内
- 区分使用TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT数据类型。例如取值范围为0-80时,使用TINYINT UNSIGNED
- 区分使用DATETIME和TIMESTAMP。存储年使用YEAR类型。存储日期使用DATE类型。 存储时间(精确到秒)建议使用TIMESTAMP类型
存储:
- 不在数据库中存储图片、文件等大数据
- 避免使用存储过程、视图、触发器、事件
外键:
- 避免使用外键,外键用来保护参照完整性,可在业务端实现
查询规范
- 禁止使用select *,要查询数据后面必须紧跟字段值
- 避免使用负向查询,例如 not in、!=、not like,否则容易造成全表扫描
- 避免使用%前导查询,例如:like “%abc”,无法利用到索引
- SQL中避免出现now()、rand()、sysdate()、current_user()等不确定结果的函数
- 拆分复杂SQL为多个小SQL,避免大事务
- 禁止使用order by rand()
- 尽量用IN来替换OR
- 尽量避免多表Join查询