「为什么写」
一直想写数据库相关的文章,最直接的原因是数据库这块我们工作中每天都会用到,也是面试求职绕不开的话题,无论你是何种测试,优秀的数据库能力都会非常加分,最近我在总结数据库性能优化这块内容,性能这块就如庖丁解牛,首先你需要知道牛的全貌,筋脉布局,才能解之,今天这篇文章,也先从全局的角度来看数据库性能优化这件事。
「管中窥豹」
我们常常听到一句话,性能优化皆io,可以认为性能优化的核心思想就是减少io操作,之前和一同学聊天,发现不少人认为减少io就是减少磁盘操作,这其实很不全面,Cpu->Cache->Net->Mem->Disk, 每一步都是io,片面的认为磁盘,那你只是看到了牛腿,解不了全牛,下面我罗列的每一块硬件资源,在数据库层面都具备着相应的职能,成本以及开销。
硬件资源的速度排序大体可以这么认为:CPU>Cache>内存>网络>硬盘,一直说的减少io操作本质是减少性能相对较差的io开销,在性能较好的资源上进行操作,每一种优化法则都是解决其对应硬件的性能问题,当我们遇到性能问题时,不应该简单说通过加硬件资源去解决,这种解法一般叫做扬汤止沸,解决不了本质问题,而是应当通过我们的图谱或者叫知识体系提出性价比最高的解决方案
「常用的优化手段」
1.表设计(符合3NF)
NF的意思是范式,粗略而言数据库分为三个范式。即:第一范式 第二范式 第三范式。
第一范式的意思是:数据表中的字段都是不可分割的,原子的。第一范式是最简单的,也是必需的。
第二范式:在第一范式的基础上,数据表中各字段和主键之间完全依赖,不存在部分依赖。例如:数据表中存在字段<学号,姓名,分数>组成,其中<学号,姓名>组合在一起构成主键。如果学生的姓名不重复的情况下,那么就存在部分依赖。
第三范式:第二范式的基础上,不存在传递依赖。
所谓传递依赖是指:例如:数据表中存在字段<学号,姓名,分数>组成,其中<学号>是主键。如果学生的姓名不重复的情况下,那么就存在传递依赖。即:学号可以唯一确定姓名,而姓名是不重复的,所以,姓名也可以唯一确定分数。那么,学号决定分数就不唯一了,中间还有姓名可以确定。这就是所谓的传递依赖。
2.优化SQL语句
a.获取到慢sql,processlist,或者慢查询
b.explain 分析
c.索引分析,sql规范分析
d.业务层面逻辑分析
3.分表
a.垂直切分:将同一个表的内容,按照数据热度不同切分字段,按照3nf原则,划分为多个表。
分表理由:根据数据的活跃度进行分离,随着目前nosql的流行,竖直切分用的不多
b.水平切分:把大的表结构,横向切割为同样结构的不同表,表结构是完全一样, 按照数量级切割。
分表理由:根据数据量的规模来划分,保证单表的容量不会太大,保证单表的查询等处理能力。
4. 读写分离
a. 主库update,insert,delete
b. 从库select
5. 存储过程
a.批量运算,执行速度相对较高
b.减少网络开销
6.对mysql配置优化
a.查询排序时所能使用的缓冲区大小 read_buffer_size
b.查询缓存 query_cache_size
c. 最大连接数 max_connections