MySQL数据库开发规范
一、命名规范
1.库名、表名、字段名必须使用小写字母,并采用下划线分割
2.库名、表名、字段名中禁止使用‘-’(减号)或其它关联字符(如to、from等)
3.库名、表名、字段名禁止超过32个字符,需要见名知意
4.视图以_view结尾、事件以_event结尾,触发器以_triger结尾,存储过程以_proc结尾,函数以_func结尾
5.普通索引以idx_col1_col2名命,唯一索引以uk_col1_col2开头
6.临时库、表须以_tmp+日期为后缀(如eip_con_tmp20200701)
(例)库名规范写法:cms_general
表名规范写法:eip_con
字段名规范写法:con_code
普通索引规范写法:idx_con_type
唯一索引规范写法:uk_con_code
视图规范写法:ipo_po_view
事件规范写法:ipo_po_event
触发器规范写法:ipo_po_triger
存储过程规范写法:ipo_po_proc
函数的规范写法:ipo_po_func
二、库、表基础规范
1.使用Innodb存储引擎
2.库、表字符编码统一使用utf8mb4,校对字符集使用utf8mb4_general_ci
3.给所有的表和字段添加注释,对含有字典的字段要在注释中标明数据字典
4.单表字段不应超过50,超过50个字段的单表应垂直分表
5.所有的表都应显示指定主键,除业务主键外还应设置递增的逻辑主键(无意义主键)保证记录的顺序存取
6.禁止使用外键,避免插入记录时做主表校验
7.尽量不要使用存储过程、视图,禁止使用触发器、事件影响debug问题定位和数据库不记录log
8.数据库中不允许使用明文密码,使用加密工具对数据进行脱敏后存储
三、字段规范
1.对于长度固定且更新频繁的列使用char字符类型
2.varchar(M)类型的M值不得超过4000,避免影响单行记录最大字符数
3.对于存放容量很大,操作不频繁的值可以使用text类型,text类型可变长,在20字节以后的内容在数据页以外的空间存储,多一次寻址,避免创建索引
4.status、type、flag等字段使用tinyint类型
5.对于数据类型字段使用unsigned存储非复数值
6.主键建议使用bigint unsigned
7.时间类型的字段建议优先使用timestamp,timestamp占4字节,datetime占8字节,且两者时间范围不同(timestamp只支持1970-01-01 08:01 ~ 2038-01-19 11:14:07)
8.索引字段一定要设置成not null,否则影响优化器对索引的选择
9.字段尽量使用not null,如果不能保证insert时一定有值,应设定default值并指定含义
10.不同表中的同一意义的字段属性必须相同(字段名、数据类型、字段长度)
四、SQL规范
1.杜绝使用 select *
2.确定返回结果只有一条时使用limit 1
3.避免隐式转换对性能的影响
4.禁止在where条件上使用函数,会导致索引失效,如必须使用应放在右侧的常量上
5.使用like模糊匹配时不要将%放在首位导致索引失效
6.尽量将复杂的SQL拆分成简单SQL(不以代码处理复杂为由),若查询条件涉及多个索引可以拆分成多个SQL再讲结果union all
7.使用join代替子查询,避免临时表的建立
8.在没有去重要求的操作使用union all代替union,减少排序的cost
9.分页方式应将上一次的分页边界值放在where条件中再limit
10.杜绝使用恒真的where条件,避免SQL注入
11.业务SQL不允许出现DDL语句
五、行为规范:
1.禁止在数据运维组不知情的情况下大批量导入导出数据
2.禁止对大表执行ctas(锁表)以及insert into ... select(阻断其它会话DML)操作
3.备份恢复数据避开高峰期,由数据运维组操作