参考文档: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 = 6630913
    SELECT * FROM table_name WHERE id = 6630913-1
    SELECT * FROM table_name WHERE to_days(current_date) – to_days(date_col) <= 10