数据库优化
2020-02-11 本文已影响0人
摸摸脸上的胡渣
优化整体可以分为两方面,软件方面和硬件方面。
硬件方面
成本过高,但收益也较高。
软件方面
后台程序员一般涉及到的是软件方面,成本较低且收益比较大。
其中软件方面的优化也可以分为两方面,上线前check和上线后check
上线前check
1.创建表时,要考虑表的常用字段,一般要为常用字段增加索引,但也不能全加,索引的创建和维护更新,也是耗费资源的。
2.写sql语句时,要注意尽量用到索引字段,可使用Explain命令对sql进行检查。主要是对type字段进行查看,一般用到的是type是const(应用主键或者唯一索引进行等值查询),ref(应用join或者联合索引),range(应用主键或者唯一索引进行范围查询)。
3.还应注意写sql语句时,避免因为使用函数,对列进行运算,模糊查询,错误使用联合索引等造成的索引失效情况。
上线中check
发布后,会观察后台服务器的错误日志,并且观察数据库集群的写tps和读tps,并且也会观察主从延迟等指标
上线后check
-
慢查询日志
一般公司使用的是pt-query-digest工具进行异常查询的统计,涉及的字段相关含义及其应注意点,已经总结成图。
pt-query-digest.png
我遇到的慢查询一般通过加索引解决,但是注意不要在业务高峰期进行操作,会对表的性能有影响。DBA在改表结构时,使用的是pt-online-schema-change工具,原理如下
pt-online-schema-change.png -
死锁查询
MySQL通过开启innodb_deadlock_detect开关,可以进行死锁检测,每当有事务被锁时,就会开始检测进行检测是否出现了循环依赖,如果有的话,就会将持有数据行数最少的事务进行回滚。
todo 死锁的具体案例和解决