mysql规范
整理出来如下内容,详情请查看实施规范文档。
表规则
- 存储引擎
创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为InnoDB。
- 字符集
数据库对象的字符集统一。建表SQL不要包含表和字段的字符集定义,由DBA统一控制
- mysql 5.7版本字符集为utf8,排序字符集utf8_general_ci
- mysql 8.0版本字符集utf8mb4,排序字符集utf8mb4_0900_ai_ci
- 备注信息
- 所有表必须有表备注,详细说明表的含义和用途,关联关系等
- 字段备注分“字段基本含义”和“字段详细说明”两部分,字段详细说明放在小括号中,列出字段枚举值的含义
- 数据类型
- 字符串类型统一使用VARCHAR
- 小数统一使用DECIMAL类型
- 自增主键使用BIGINT(20)类型
- 枚举类型的字段使用TINYINT(3)表达,禁止ENUM类型
- 布尔类型字段使用TINYINT(3),0为假,1为真
- 仅当需存储的字节数可能超过20000时,使用TEXT系列类型(TEXT、MEDIUMTEXT、LONGTEXT)。并和原表进行分拆,与原表主键组成新表存储,且每个表只允许有一个TEXT系列类型字段。建议对表里的blob、text等大字段,垂直拆分到其他表里,仅在需要读这些对象的时候才去查询
- 审计字段
- 必须有数据“创建时间”字段create_time,记录数据插入时间,不允许更新,建时间索引。 DATETIME类型,取默认值“CURRENT_TIMESTAMP”
- 必须有数据“最后修改时间“字段update_time ,数据插入时赋值,数据更新时必须刷新,MySQL中设置成自动刷新。DATETIME类型,取默认值“CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”
- 必须有“软删除标识”,不允许应用程序进行物理删除操作。整型字段(待确认)参考is_delete varchar(2) NOT NULL DEFAULT 'N' COMMENT '是否删除'
- 字段默认值
- 字段值不可为NULL
- 字符类型默认值设为 ''
- 数值类型默认值为设为0
- 业务日期类型默认值设为’1000-01-01 00:00:00'
- 业务日期类型默认值设为’1000-01-01 00:00:00'
- 最后修改时间默认值“CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”
- 数据“创建时间”默认值“CURRENT_TIMESTAMP”
- 字段个数
- 单表限制字段个数限制<=70,原则>30个考虑拆分,禁止单表过多。
索引规则
创建原则
- 建议单个表上的索引个数不超过7个
- 多考虑建立组合索引,并把区分度最高的字段放在最前面
- 建议建表或加索引时,表里互相不存在冗余索引。对于MySQL来说,如果表里已经存在key(a,b),则key(a)为冗余索引,需要删除
- 单个索引中每个索引记录的长度不能超过64KB
数据库
- 数据库本身、表、列所有字符集必须保持一致,8.0为utf8mb4,5.7为utf8,前端程序字符集或者环境变量中的字符集,与数据库、表的字符集必须一致。
- 必须显式指定字符集为utf8mb4
SQL
- SELECT语句必须指定具体字段名称,禁止写成*,查询必须带有条件限制,禁止全表查数据
- in值列表限制在(200-500)以内,减少底层扫描,减轻数据库压力
- 生产环境禁止使用hint
- WHERE 子句中禁止只使用全模糊的LIKE ’%name%’条件进行查找
- 分页查询,limit起点较高时,可先用过滤条件进行过滤,如(where id>=10000 and id<20000 limit 20)
- 禁止跨DB的join 语句
- 主库禁止大事务操作、大查询、影响性能的报表类功能
- 延时敏感的从库禁止大查询大数据量操作
- 禁止三表以上关联,谓词必须具有过滤数据属性,小表驱动大表