最近一个服务很慢,导致我各种排查问题,排查的时候,考虑到是不是mysql压力过大,但是这块业务的数据库是部署在AWS,运维同学反馈是看不到服务器相关信息,非常无语。但是引发了我一个思考,什么是数据库性能。
之前在QCON上面听腾讯的某个部门演讲,关于他们的服务器利用率非常高,比其他部门高50%还是多少。他们就是考虑CPU密集业务,IO密集业务来提高服务器性能利用率,可惜讲的很简单,粗略一讲就过去了。
这里我想到我怎么判断数据库是否压力过大,按照以前的逻辑就是卡了加下配置试试,也就是说关于JDBC执行业务过慢的时候,我们就去加配置。同时我们加配置的时候就是二核变四核,四核变八核,预算一直较为宽松。反正就是让各种服务器各种指标不满就行了。
但是毕竟不能总是这么解决问题,然后我就到处查资料,看下怎么判断性能。然后一堆的SQL优化,然后SQL指标。一直没有好的思路
一个纯粹的JAVA程序判断是否性能不够,我们从首先看它的接口TPS,然后看这个接口执行的时候CPU,内存是不是会爆炸,看是不是哪里IO的一直阻塞,看他的JVM的GC状态,是否可以异步来等等,来查找问题。但是一说到mysql大家就是缓存,分库分表,我承认这是非常棒的方法,但是我怎么量化的去判断了什么时候去分库分表?
后面仔细想了下,把mysql架构直接拿出来
第一张图是逻辑结构,第二张图是查询过程。那么这么看,我去查询的时候,首先mysql自己的系统需要处理SQL,这里是CPU去处理,然后从硬盘读取数据,放到内存中返回。
那么这里,性能点就变成了,CPU,内存,IO读取,又变成了一个类似于JAVA程序的性能分析了。
就可以变成了监控Mysql容器的各项指标是否正常。来量化服务器
下面文章里面是更具体的一些命令了
https://mp.weixin.qq.com/s/cO966Qvyf3kKQSlt49ke1A 可以看一下这篇文章,这里有一个更具体的介绍。
这是从mysql层面去看,但是更具体的sql优化,就要从其他角度去看了
比如说半双工通信,缓存机制,索引机制去看。现在想起来以前刚毕业就去去写千万数量级别的sql,当时是oracle数据库,感觉啥都能抗,就是看执行计划然后优化,真的是莽夫。
可以看下这篇,这个是一些SQL一些执行指标命令
https://baike.xsoftlab.net/view/217.html
索引机制,也是懵懵懂懂的,tree+树,虽然原理看起来好像很简单,等我啃书完了,再来更加深入的答一波