编写本规范的目的是为了统一数据库命名风格,提高SQL的可读性、可重用性,确保在开发成员或开发团队之间的工作可以顺利交接,不必花很大的力气便能理解已编写的数据库对象;遵守某些规范也能提升性能,提高程序的稳定性。
数据库规范一般包含:数据库命名规范
、数据库基本设计规范
、数据库索引设计规范
、数据库字段设计规范
、数据库SQL开发规范
、数据库操作行为规范
。
1.数据库命名规范
mysql 数据库关键字查询
数据库命名规范:
- 所有数据库对象名称必须使用小写字母并用下划线分割(mysql对大小写敏感)
- 所有数据库对象名称禁止使用MySQL保留关键字
- 数据库对象的命名要做到见名识义,并且最好不要超过32个字符
- 所有的临时表必须以tmp为前缀并以日期为后缀
- 所有的备份表必须以bak为前缀并以日期为后缀
- 所有存储相同数据的列名和列类型必须一致
2.数据库基本设计规范
数据库基本设计规范:
- 所有表必须使用Innodb存储引擎,除非Innodb不能满足当前业务需求
- 数据库和表的字符集统一使用UTF-8
- 所有的表和字段都要添加注释
- 尽量控制单表数据量的大小,建议控制在500万以内(当单表数据达到所规定的上限,可以采用历史数据归档,分库分表等手段来控制数量大小)
- 尽量做到冷数据分离,减少表的宽度
- 禁止在表中建立预留字段
- 禁止在数据库存储图片,文件等二进制数据(正确做法将图片、文件放在服务上,数据库只记录位置信息)
- 禁止在线上做数据库压力测试
- 禁止从开发环境,测试环境直连生产环境数据库
注意:mysql中UTF-8字符集汉子占3个字节,ASCll码占一个字节
mysql中并没有对单表存储进行限制,这种限制取决于存储设置和文件系统。
3.数据库索引设计规范
数据库索引设计规范:
- 限制每张表上的索引数量,建议单张表索引不超过5个
- 每个Innodb表必须有一个主键(建议不使用更新频繁的列作为主键,不使用多列主键,不使用UUID,MD5,HASH,字符串作为主键)
- 对于频繁的查询优先考虑使用覆盖索引
- 尽量避免使用外键(不建议使用外键约束,但一定在表与表之间的关联键上建立索引)
如何选择索引列的顺序
如何选择索引列的顺序:
- 区分度最高的列放在联合索引的最左侧
- 尽量把字段长度小的列放在联合索引的最左侧
- 使用最频繁的列放到联合索引的左侧
4.数据库字段设计规范
字段类型的选择,会直接影响数据库的性能。
数据库字段设计规范:
- 要优先选择符合存储需要的最小的数据类型
- 避免使用TEXT、BLOB数据类型
- 避免使用ENUM数据类型
- 尽可能把所有列定义为NOT NULL
- 使用TIMESTAMP或DATETIME类型存储时间
- 同财务相关的金额类数据,必须使用decimal类型
要优先选择符合存储需要的最小的数据类型理由:
- 将字符串转化为数字类型存储(INET_ATON(‘255.255.255.255’) = 4294967295, INET_NTOA(4294967295) = ‘255.255.255.255’)
- 对于非负型的数据来说,要优先使用无符号整型来存储(无符号整型 比有符号整型可以多出一倍的空间)
- VARCHAR(N)中的N代表的字符数,而不是字节数
- 使用UTF8存储汉字Varchar(255) = 756字节
- 过大的长度会消耗更多的内存
避免使用TEXT、BLOB数据类型:
- 建议把BLOB或者TEXT列分离到单独的扩展表中
- TEXT或BLOB类型只能使用前缀索引
避免使用ENUM数据类型:
- 修改ENUM值需要使用ALTER语句,频繁对表结构进行修改容易造成失误
- ENUM类型的ORDER BY操作效率低,需要额外操作
- 禁止使用数值作为ENUM的枚举值
尽可能把所有列定义为NOT NULL:
- 索引NULL列需要额外的空间来保存,所以要占用更多的空间
- 进行比较和计算时要进行对NULL值做特别处理
同财务相关的金额类数据,必须使用decimal类型:
- Decimal类型为精准浮点数,在计算时不会丢失精度
- 占用空间有定义的宽度决定
- 可用于存储比bigint更大的整数数据
5.sql开发规范
sql开发规范:
- 建议使用预编译语句进行数据库操作
- 避免数据类型的隐式转换
- 充分利用表上已经存在的索引
- 程序连接不同的数据库使用不同的账号,禁止跨库查询
- 禁止使用SELECT *,必须使用SELECT <字段列表>查询字段列表>
- 禁止使用不含字段列表的INSERT语句
- 避免使用子查询,可以把子查询优化为join操作
- 避免使用JOIN关联太多的表
- 减少同数据库的交互次数
- 使用in代替or
- 禁止使用order by rand()进行随机排序
- WHERE从句中禁止对列进行函数转换和计算
- 在明显不会有重复值时使用UNION ALL 而不是UNION
- 拆分复杂的大SQL为多个小SQL
避免使用子查询,可以把子查询优化为join操作原因:
- 子查询的结果集无法使用索引
- 子查询会产生临时表操作,如果子查询数据量大则严重影响效率
- 子查询会产生大量的临时表,消耗过多的CPU及IO资源
使用in代替or:
6.数据库操作行为规范
数据库操作行为规范:
- 超过100万的批量写操作,要分批多次进行操作
- 对于大表使用pt-online-schema-change修改表结构
- 禁止为程序使用的账号赋予super权限
- 对于程序连接数据库账号,遵循权限最小原则
- 程序使用数据库账号只能在一个DB下使用,不准跨库
- 程序使用的账号原则上不准有drop权限