mysql规范

整理出来如下内容,详情请查看实施规范文档。

表规则

  1. 存储引擎

创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为InnoDB。

  1. 字符集

数据库对象的字符集统一。建表SQL不要包含表和字段的字符集定义,由DBA统一控制

  1. mysql 5.7版本字符集为utf8,排序字符集utf8_general_ci
  2. mysql 8.0版本字符集utf8mb4,排序字符集utf8mb4_0900_ai_ci
  3. 备注信息
  4. 所有表必须有表备注,详细说明表的含义和用途,关联关系等
  5. 字段备注分“字段基本含义”和“字段详细说明”两部分,字段详细说明放在小括号中,列出字段枚举值的含义
  6. 数据类型
  7. 字符串类型统一使用VARCHAR
  8. 小数统一使用DECIMAL类型
  9. 自增主键使用BIGINT(20)类型
  10. 枚举类型的字段使用TINYINT(3)表达,禁止ENUM类型
  11. 布尔类型字段使用TINYINT(3),0为假,1为真
  12. 仅当需存储的字节数可能超过20000时,使用TEXT系列类型(TEXT、MEDIUMTEXT、LONGTEXT)。并和原表进行分拆,与原表主键组成新表存储,且每个表只允许有一个TEXT系列类型字段。建议对表里的blob、text等大字段,垂直拆分到其他表里,仅在需要读这些对象的时候才去查询
  13. 审计字段
  14. 必须有数据“创建时间”字段create_time,记录数据插入时间,不允许更新,建时间索引。 DATETIME类型,取默认值“CURRENT_TIMESTAMP”
  15. 必须有数据“最后修改时间“字段update_time ,数据插入时赋值,数据更新时必须刷新,MySQL中设置成自动刷新。DATETIME类型,取默认值“CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”
  16. 必须有“软删除标识”,不允许应用程序进行物理删除操作。整型字段(待确认)参考is_delete varchar(2) NOT NULL DEFAULT 'N' COMMENT '是否删除'
  17. 字段默认值
  18. 字段值不可为NULL
  19. 字符类型默认值设为 ''
  20. 数值类型默认值为设为0
  21. 业务日期类型默认值设为’1000-01-01 00:00:00'
  22. 业务日期类型默认值设为’1000-01-01 00:00:00'
  23. 最后修改时间默认值“CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”
  24. 数据“创建时间”默认值“CURRENT_TIMESTAMP”
  25. 字段个数
  26. 单表限制字段个数限制<=70,原则>30个考虑拆分,禁止单表过多。

索引规则

创建原则

  1. 建议单个表上的索引个数不超过7个
  2. 多考虑建立组合索引,并把区分度最高的字段放在最前面
  3. 建议建表或加索引时,表里互相不存在冗余索引。对于MySQL来说,如果表里已经存在key(a,b),则key(a)为冗余索引,需要删除
  4. 单个索引中每个索引记录的长度不能超过64KB

数据库

  1. 数据库本身、表、列所有字符集必须保持一致,8.0为utf8mb4,5.7为utf8,前端程序字符集或者环境变量中的字符集,与数据库、表的字符集必须一致。
  2. 必须显式指定字符集为utf8mb4

SQL

  1. SELECT语句必须指定具体字段名称,禁止写成*,查询必须带有条件限制,禁止全表查数据
  2. in值列表限制在(200-500)以内,减少底层扫描,减轻数据库压力
  3. 生产环境禁止使用hint
  4. WHERE 子句中禁止只使用全模糊的LIKE ’%name%’条件进行查找
  5. 分页查询,limit起点较高时,可先用过滤条件进行过滤,如(where id>=10000 and id<20000 limit 20)
  6. 禁止跨DB的join 语句
  7. 主库禁止大事务操作、大查询、影响性能的报表类功能
  8. 延时敏感的从库禁止大查询大数据量操作
  9. 禁止三表以上关联,谓词必须具有过滤数据属性,小表驱动大表
Last Updated:
Contributors: 刘荣杰