一丶数据库规范
1.所有的数据库表名必须以小写字符标识
并且不能与数据库关键字重合
2.临时必须以tmp为前缀以日期为后缀
3.备份表必须以bak为前缀以日期为后缀
4.相同列名的数据类型必须一致
5.所有的表和字段要添加注释
6.尽量控制单表数据量的大小,建议控制在500万行以内(500万不是mysql数据库的限制)7
7.尽量避免使用mysql分区表,可以使用物理分区表的方式管理大数据
8.禁止在表中建立预留字段 修改一个字段远远大于增加一个字段的消耗
9.禁止在数据库中存储图片,文件等二进制数据
10.禁止在线上做数据库压力测试
11.禁止从开发环境,测试环境直接连接生产环境的数据库
12.禁止查询不需要的字段
二丶索引的规范
1.限制每张表上的索引数量,建议单张表索引不超过5个
2.每个Innodb表必须有一个主键,不使用更新频繁的列作为主键,不使用多列主键
3.常见需要建立索引的字段:
-在select update delete语句中where从句中出现的列。
-包含在order by group by distinct中的字段。
(一般使用组合索引)
-多表join的关联列。
4.索引列的顺序
-区分度最高的列放在联合索引的最左侧 1
-尽量把字段长度小的列放在联合索引的最左侧 2
-使用最频繁的列放在联合索引的左侧 3
5.避免建立冗余索引和重复索引
重复索引:example:primary key(id),index (id),unique index(id)
冗余索引:index(a,b,c),index(a,b),index(a)
6.对于频繁的查询优先考虑使用覆盖索引(既包含所有的查询字段)
7.尽量避免使用Innodb的外键约束
三丶数据库字段设计规范
1.优先选择符合存储需要的最小数据类型
-将字符串转化为数字类型存储
如:inet_aton('255.255.255.255')=4294967295
inet_ntoa(4294967295)='255.255.255.255'
-对非负整数来说优先使用unsigned
-varchar(N) n表示字符数,而不是字节数,varchar(255)utf8存储汉字占用765个字节
2.避免使用text,blob,enum数据类型
3.尽可能把所有列定义为not null
4.使用timestamp 4个字节有范围(存储空间比datatime小)或datatime(8个字节)类型存储时间
5.同财务相关的金额类数据,必须使用decimal类型,float和double是非精准浮点数
四丶数据库SQL开发规范
1.建议使用预编译语句进行数据库操作
2.避免数据类型的隐式转换
3.充分利用表上已经存在的索引
-避免使用双%号的查询条件,如a like '%123%'
-一个sql只能利用复合索引的一列进行范围查询
-使用left join或not exists来优化not in操作
4.程序连接不同的数据库使用不同的账号,禁止跨库查询
5.禁止使用select * 必须使用select<字段列表>查询
6.禁止使用不含字段列表的insert语句
7.禁止使用子查询,可以把子查询优化为join操作
8.避免使用join关联太多的表(建议不超过5个)
9.减少同数据库的交互次数(数据库更适合处理批量操作)
10.禁止使用order by rand()进行随机排序,应该在程序中生成一个随机值,然后根据随机值取数据。
11.禁止在where从句中进行函数转换和计算
例如:where date(createtime)='20160901'
->where createtime>='20160901' and createtime<'20160902'
12.在明显不会用重复值是使用union all而不使用union
13.拆分复杂的大sql为多个小sql
五丶数据库操作行为规范
1.超过100万行的批量写操作,要分批多次进行操作
2.禁止为程序使用的账号赋予super权限
3.对于程序连接数据库账号,遵循最小原则
-程序使用的数据库账号只能在一个db下使用,不准跨库使用
-程序使用的账号原则上不准有drop权限
1.所有的数据库表名必须以小写字符标识
并且不能与数据库关键字重合
2.临时必须以tmp为前缀以日期为后缀
3.备份表必须以bak为前缀以日期为后缀
4.相同列名的数据类型必须一致
5.所有的表和字段要添加注释
6.尽量控制单表数据量的大小,建议控制在500万行以内(500万不是mysql数据库的限制)7
7.尽量避免使用mysql分区表,可以使用物理分区表的方式管理大数据
8.禁止在表中建立预留字段 修改一个字段远远大于增加一个字段的消耗
9.禁止在数据库中存储图片,文件等二进制数据
10.禁止在线上做数据库压力测试
11.禁止从开发环境,测试环境直接连接生产环境的数据库
12.禁止查询不需要的字段
二丶索引的规范
1.限制每张表上的索引数量,建议单张表索引不超过5个
2.每个Innodb表必须有一个主键,不使用更新频繁的列作为主键,不使用多列主键
3.常见需要建立索引的字段:
-在select update delete语句中where从句中出现的列。
-包含在order by group by distinct中的字段。
(一般使用组合索引)
-多表join的关联列。
4.索引列的顺序
-区分度最高的列放在联合索引的最左侧 1
-尽量把字段长度小的列放在联合索引的最左侧 2
-使用最频繁的列放在联合索引的左侧 3
5.避免建立冗余索引和重复索引
重复索引:example:primary key(id),index (id),unique index(id)
冗余索引:index(a,b,c),index(a,b),index(a)
6.对于频繁的查询优先考虑使用覆盖索引(既包含所有的查询字段)
7.尽量避免使用Innodb的外键约束
三丶数据库字段设计规范
1.优先选择符合存储需要的最小数据类型
-将字符串转化为数字类型存储
如:inet_aton('255.255.255.255')=4294967295
inet_ntoa(4294967295)='255.255.255.255'
-对非负整数来说优先使用unsigned
-varchar(N) n表示字符数,而不是字节数,varchar(255)utf8存储汉字占用765个字节
2.避免使用text,blob,enum数据类型
3.尽可能把所有列定义为not null
4.使用timestamp 4个字节有范围(存储空间比datatime小)或datatime(8个字节)类型存储时间
5.同财务相关的金额类数据,必须使用decimal类型,float和double是非精准浮点数
四丶数据库SQL开发规范
1.建议使用预编译语句进行数据库操作
2.避免数据类型的隐式转换
3.充分利用表上已经存在的索引
-避免使用双%号的查询条件,如a like '%123%'
-一个sql只能利用复合索引的一列进行范围查询
-使用left join或not exists来优化not in操作
4.程序连接不同的数据库使用不同的账号,禁止跨库查询
5.禁止使用select * 必须使用select<字段列表>查询
6.禁止使用不含字段列表的insert语句
7.禁止使用子查询,可以把子查询优化为join操作
8.避免使用join关联太多的表(建议不超过5个)
9.减少同数据库的交互次数(数据库更适合处理批量操作)
10.禁止使用order by rand()进行随机排序,应该在程序中生成一个随机值,然后根据随机值取数据。
11.禁止在where从句中进行函数转换和计算
例如:where date(createtime)='20160901'
->where createtime>='20160901' and createtime<'20160902'
12.在明显不会用重复值是使用union all而不使用union
13.拆分复杂的大sql为多个小sql
五丶数据库操作行为规范
1.超过100万行的批量写操作,要分批多次进行操作
2.禁止为程序使用的账号赋予super权限
3.对于程序连接数据库账号,遵循最小原则
-程序使用的数据库账号只能在一个db下使用,不准跨库使用
-程序使用的账号原则上不准有drop权限