关于mysql数据库的n条军规整理

2020-08-04  本文已影响0人  Koln_781a

本文的军规的整理思路来自于该出处,对里面部分内容进行重新整理,也有部分来自于笔者自己开发团队在实际生产环境中的总结

军规就是强制性,或许你觉得没这么严重吧?在并发量小,数据量小的应用来说,军规确实是可有可无。。。但如果你是面对一个高并发,有一定规模数据的应用,军规则是整个系统高可用并能最大限度的处理各种高并发的基本保证

一,核心军规

尽量不在数据库做运算
复杂的运算(例如:md5,order by rand())放在程序端
控制单表数据量 纯INT不超过1000w条,含Char不超过500w条
合理分表(根据userid, date,area),建议单库不超过300-400个表
保持表身段苗条
表字段数少而精,控制在20到50个,一般纯int字段不超过50个,char字段不超过20个,这样有利于高效io,全表遍历,表修复快,提高并发
平衡范式和冗余
效率优先,提升性能为主,要依据业务需求,仔细权衡数据查询和数据更新关系,指定最合适的范式化程度
拒绝大SQL,复杂事务,大批量任务
禁止存储大文件或者二进制照片
通常文件很大,会短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机IO操作,文件很大时,IO操作很耗时。

二,字段类军规

用好数值字段,尽量简化字段位数

不建议使用ENUM类型,可使用TINYINT来代替

把字符转化为数字
这样更高效,查询更快,占用空间更小,例如用无符号int 存储 ip,而非char (15)
必须把字段定义为NOT NULL并且提供默认值

少用并拆封Text/Blob

禁止使用小数存储货币
使用整数吧,小数容易导致钱对不上

必须使用varchar(20)存储手机号

三,索引类军规

谨慎合理添加索引

禁止在更新十分频繁、区分度不高的属性上建立索引

不在索引列做运算
会导致无法命中索引而导致全表扫描
自增列或全局ID做InnoDB主键

尽量不用外键
外键可节省开发量,但会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql性能,特别是高并发下容易造成死锁,非常容易影响数据库性能,因此还是由程序保证约束更好

四,SQL类军规

SQL尽可能简单
一条sql只能在一个cpu运算,在高并发下,1秒是大sql可能把整个数据库堵死,而多个简单sql缓存命中率更高,较少锁表时间,用上多核
保持事务连接短小

尽量不用Select*

改写Or为IN()

改写Or为Union
减少对不同字段进行or 查询,,merge index 往往很弱智
避免负向查询和%前缀模糊查询
负向查询: NOT ,!= , <>, !<, !>, NOT EXISTS,NOT IN, NOT LIKE等,使用不了索引而导致全表扫描
Count不要使用在可Null的字段上面

Limit高效分页
SELECT * FROM message where limit 9527,10
因为偏移量越大越慢,所以建议通过下面方式:

使用Union ALL 而不用Union
若无需对结果去重则用union all ,union有去重开销
分解链接,保证高并发
高并发不建议使用两个表以上的join
Group By 去除排序
group by 会分组和自动排序,如果不需要排序可以加上 order by null,这样会更快
同数据类型的列值比较 原则是数字对数字,字符对字符

Load Data导入数据

打散大批量更新,尽量凌晨操作
避开高峰期,白天可以做限制100条每秒 程序上
know every sql (explain, show slow log,)
禁止使用存储过程、视图、触发器、Event
高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU计算还是上移吧
禁止在WHERE条件的属性上使用函数或者表达式
SELECT uid FROM t_user WHERE from_unixtime(day)>='2017-02-15' 会导致全表扫描
正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp('2017-02-15 00:00:00')
禁止大表使用JOIN查询,禁止大表使用子查询
会产生临时表,消耗较多内存与CPU,极大影响数据库性能

五,约定类军规

隔离线上线下
严格的权限控制,,开发无线上操作权限
禁止未经DBA认证的子查询
永远不在程序段显式加锁
外部锁对数据库不可控,高并发是灾难,极难调试和排查
表字符集统一使用UTF8MB4字符集

统意命名规范

上一篇下一篇

猜你喜欢

热点阅读