数据库设计规范
1.数据库设计规范
所有的数据库对象名称必须使用小写字母并用下划线分割
所有的数据库对象名称禁止使用mysql的保留关键字
数据库对像的命名要能做到见名识义,并且最好不要超过32个字符
临时库表必须以tmp为前缀并以日期为后缀
备份库,备份表必须以bak为前缀并以日期为后缀
所有表和字段都需要添加注释使用comment从句添加表和列的备注
尽量控制单表数据量的大小,建议控制在500万以内500万并不是MySQL数据库的限制,可以用历史数据归档,分库分表等手段来控制数据量大小
禁止在表中建立预留字段
禁止在数据库中存储图片,文件等二进制数据
禁止在线上做数据库压力测试
禁止从开发环境,测试环境直连生产环境数据库
2.索引设计规范
限制每张表上的索引数量,建议单张表索引不超过5个
禁止给表中的每一列都建立单独的索引
每个Innodb表必须有一个主键,不使用UUID,MD5,HASH,字符串列作为主键,不使用更新频繁的列作为主键,不使用多列主键
主键建议选择使用自增ID值
区分度最高的列放在联合索引的最左侧
尽量把字段长度小的列放在联合索引的最左侧
使用最频繁的列放到联合索引的左侧
对于频繁的查询优先考虑使用覆盖索引
3.数据库字段设计规范
优先选择符合存储需要的最小的数据类型,例如:将字符串转化为数字类型存储,将IP转换为数字INET ATON(′255.255.255.255')=4294967295
对于非负型的数据来说,要优先使用无符号整型来存储,无符号相对于有符号可以多出一倍的存储空间
VARCHAR(N)中的N代表的是字符数,而不是字节数,使用UTF8存储汉字Varchar(255)=765个字节,过大的长度会消耗更多的内存
避免使用TEXT、BLOB数据类型,text有64k大小,一般的评论、备注用不到64k,所以采用varchar类型存储
避免使用ENUM数据类型,修改ENUM值需要使用ALTER语句,ENUM类型的ORDER BY操作效率低,需要额外操作
尽可能把所有列定义为NOT NULL,索引NULL列需要额外的空间来保存,所以要占用更多的空间,进行比较和计算时要对NULL值做特别的处理
字符串存储日期型的数据(不正确的做法)缺点1:无法用日期函数进行计算和比较缺点2:用字符串存储日期要占用更多的空间使用TIMESTAMP或DATETIME类型存储时间
1.非精准浮点:float,double2.精准浮点:decimal,同财务相关的金额类数据,必须使用decimal类型
4.数据库SQL的规范
4.1建议使用预编译语句进行数据库操作
select * from user
如上,数据库操作SQL时需要将星号转换为对应的列,消耗数据库的资源
4.2避免数据类型的隐式转换
select name,phone from customer where id='111'
如上,数据库中id为整形,而参数是字符串,数据库操作时会进行参数转换耗费时间
4.3避免使用双%号或前置%的查询条件。如a like '%123%'或a like '%123',这些可能无法使用索引,需要的话使用后置%
4.4禁止使用不含字段列表的INSERT语句
insert into t values(a''b''c'); (错误)
insert into t(c1,c2,c3)values('a','b','c'); (正确)
目的:可减少表结构变更带来的影响
4.5避免使用子查询,可以把子查询优化为join操作,子查询会产生临时表操作,如果子查询数据量大则严重影响效率
4.6避免使用JOIN关联太多的表
4.7减少同数据库的交互次数数据库更适合处理批量操作,合并多个相同的操作到一起,可以提高处理效率
4.8使用in 代替or,in的值不要超过500个,in 操作可以有效的利用索引
4.9禁止使用order by rand0进行随机排序,推荐在程序中获取一个随机值,然后从数据库中获取数据的方式
4.10WHERE从句中禁止对列进行函数转换和计算,对列进行函数转换或计算会导致无法使用索引
where date(createtime)=‘20160901'(不推荐)
where createtime>=‘20160901'and createtime<′20160902'(推荐)
4.11在明显不会有重复值时使用UNION ALL 而不是UNION,UNION会把所有数据放到临时表中后再进行去重操作,UNION ALL 不会再对结果集进行去重操作
4.12拆分复杂的大SQL为多个小SQL,MySQL一个SQL只能使用一个CPU进行计算,SQL拆分后可以通过并行执行来提高处理效率
5.数据库操作规范
5.1超100万行的批量写操作,要分批多次进行操作,大批量操作可能会造成严重的主从延迟,binlog日志为row格式时会产生大量的日志,避免产生大事务操作
5.2对于大表使用pt-online-schema-change修改表结构
5.3禁止为程序使用的账号赋予super权限