一、数据库命名规范
a、所有数据库对象名称必须使用小写字母并用下划线分割(数据库对大小写敏感)
b、禁用mysql保留关键字
c、命名尽量不超过32个字符
d、临时表以tmp为前缀并以日期为后缀
备份表以bak为前缀并以日期为后缀
二、数据库基本设计规范
a、所有表使用Innodb存储引擎(5.6以后默认引擎,支持事务,行级锁,更好的恢复性,高并发下性能更好)
b、数据库和表字符集统一使用UTF8(避免由于字符集转换产生的乱码)
c、所有表和字段添加注释(从一开始就进行数据字典的维护)
d、尽量控制单表数据量的大小,500w以内
(限制取决于存储设置和文件系统)
e、减小表的宽度(mysql限制最多存储4096列)保证内存缓存命中率
f、禁止数据库中存储图片,文件等二进制数据
g、禁止在线上做数据库压力测试
三、数据库索引设计规范
a、限制每张表索引数量,单张表索引不超过5个(增加查询效率同样也会降低插入和更新效率)
b、每个Innodb表必须有一个主键(不使用更新频繁的列作为主键,不使用多列主键)
image.pngc、合理选择复合索引列顺序
d、避免建立冗余索引和重复索引
primary key(id) index(id) unique index(id)
index(a,b,c) index(a,b)
image.pnge、对频繁查询优先考虑使用覆盖索引
image.pngf、尽量避免使用外键(不建议使用外键约束,但一定在表与表间关联键上建立索引)
四、数据库字段设计规范
a、选择复合存储需要最小数据类型
将字符串转换为数字类型存储
INET_ATON(’255.255.255.255’)= 4294967295
INET_NTOA(4294967295) = ’255.255.255.255’
非负数据采用无符号整型进行存储
VARCHAR(N) N代表的是字符数而不是字节数
b、避免使用TEXT BLOG数据类型
避免使用ENUM数据类型
c、尽可能把所有列定义为not null 属性
d、使用timestamp(4字节 到2038年)或datetime类型存储时间
e、金额类数据必须使用decimal类型
非精准浮点(float double)精准浮点(decimal)
五、数据库SQL开发规范
image.pnga、建议使用预编译进行数据库操作
b、避免数据类型隐式类型转换(会导致索引失效)
select * where id=“111"
image.pngc、充分利用表上已存在的索引
d、程序连接不同数据库使用不同账号,禁止跨库查询
e、禁止select * 查询(消耗更多cpu和io及网络带宽资源 减少表结构变更 无法使用覆盖索引)
f、禁止不含字段列表insert语句
g、避免子查询可优化为join操作
子查询结果无法使用索引
子查询会产生临时表操作,若子查询数据量大则严重影响效率
消耗更多cpu和io资源
h、避免使用join关联太多的表
i、减少同数据库的交互次数
j、in代替or
k、禁止使用order by rand() 进行随机排序
l、where从句禁止对列进行函数转换和计算
m、明显不会有重复值时使用union all 而不是union
n、拆分复杂大sql为多个小sql
六、数据库操作行为规范
a、超100w行批量写操作,要分批多次操作
b、对大表数据结构修改会造成严重锁表操作
大表pt-online-schema-change修改表结构
c、禁止为程序使用账号赋予super权限
d、对于程序连接数据库账号,遵循权限最小原则
网友评论