参考文档:https://github.com/zhishutech/mysql-sql-standard/blob/master/SUMMARY.md
基础规范
- 全部使用 InnoDB 引擎,MyISAM适用场景非常少
- MyISAM与InnoDB区别
- 字符集:统一使用 utf8mb4
- 注释规范
- 表注释必须加
- 字段注释除了id,created_at, updated_at, is_deleted, deleted_at 字段,其他字段注释必须加上(待补充)
- 枚举类型的,必须标明每个状态的含义
- 少用 text/blob
- 不在数据库里存图片
- 大文件和照片存储在文件系统,数据库里存文件地址
- 拒绝 大SQL, 大事务, 大批量
- 事务/连接使用原则:即开即用,用完即关
- 与事务无关操作放到事务外面,减少锁资源的占用
- 不破坏一致性前提下,使用多个短事务代替长事务
- 打散大批量更新
- 最少授权
- 线上数据库和测试数据库尽可能保持一致
- 禁止明文存储机密数据,需至少两次加密(部分数据可逆运算)
命名规范
- 术语表
- 数据库名、表名、字段名只用小写字母、数字、下划线组合
- 尽量使用单数形式
- 命名长度不超过32个字符
- 不使用select、update、order等保留字(待补充)
- 尽量使用英文,少用或不用中文拼音
- 临时用加上 tmp 前缀
- 历史归档加上完整日期
字段规范
- 字段必须定义为NOT NULL并且提供默认值
- 显式指定自增 int/bigint 作为主键
- 使用timestamp记录时间
- IPv4地址采用4字节int unsigned
- 性别、状态、是否、小范围枚举使用tinyint
- 字符集统一使用utf8mb4
SQL规范
- 简化每一条SQL,短事务,快速执行、无阻塞
- 用括号显示确定AND、OR的先后顺序,避免混淆
- 有些查询只需扫描索引,无需扫描数据(SELECT id, user FROM table WHERE id = 1234)
- 过滤用户提交SQL,防止注入
- 不用/少用子查询,改造成连接(JOIN)
- 不用/少用FOR UPDATE、LOCK IN SHARE MODE,防止锁范围扩大化
- SQL中不用/少用函数,可能造成额外开销或导致无法使用索引
索引规范
- 显式指定自增 int/bigint unsigned not null 作为主键
- 尽量不用外键
- 合理利用覆盖索引,但字段尽量不超过5个
- 长字符字段使用前缀索引
- 及时删除冗余索引
- 选择适当的索引顺序,选择性高条件靠前
- 基数(Cardinality)很低的字段不创建索引
- 采用第三方系统实现text/blob全文检索
- 不在索引列运算
SELECT * FROM table_name WHERE id + 1 = 6630913SELECT * FROM table_name WHERE id = 6630913-1SELECT * FROM table_name WHERE to_days(current_date) – to_days(date_col) <= 10