注:本篇是《高性能Mysql》第三版的读书笔记
基准测试
基准测试即性能测试,是我们判断系统的正确性&负载量的一个得力助手。
基准测试可以评估在项目未来的负载下,需要什么硬件,需要多大容量的网络,以及其他相关资源。总之压测是必然的。
基准测试一共有两个测试策略。
1.针对整个系统的整体测试。包括web mysql 网络 等等、所有的因素加到一起。
2. 单独测试Mysql 执行sql比较不同的scheme或查询的性能。
测试的指标分为吞吐量和响应时间。
吞吐量指的是单位时间内执行的事务数。叫做TPS
并发性。web服务器的并发性指的是在任意时间有多少同时发生的并发请求QPS。 数据库的并发可能打开了上千个连接,但只执行了数十个查询。并发性基准测试需要关注的是正在工作中的并发操作,或者是同时工作中的线程数。(MySQL中的连接池我理解为线程池)
可扩展性,给系统增加一倍的资源就能获得两倍的吞吐量、TPS
性能测试我就用过jmeter 可以起多个线程进行并发测试。
服务器性能剖析
性能优化是在固定的资源下能干更多的事情了,让资源利用率提升了。
一般对于一个接口/服务性能的排查过程可以在不同阶段打日志,先定位到整个服务/接口的问题出在哪,对应的慢查询进行优化!
可以使用navicat explain 创建查询计划对sql进行分析。
想使用mysql查变量配置的值的命令:show variables;
show profiles; 可以查看消耗时间,在配置的时候要保证set profiling = 1 这样才会展示消耗时间,navicat是带这个的。每次执行完都会有剖析,那个就是。状态是status
还可以使用show profile for query (query_id) 来获取制定查询的操作的耗时。
show status
返回一下计数器,既有服务器级别的全局计数器,也有基于某个连接的会话级别的计数器。
一个问题
在排查慢sql的时候我们可能就先执行 explain 使用查询计划,看一下有没有使用索引,有的时候发现使用索引了,但是为啥还是那么慢,我之前就有遇到过这个问题,这个一定要先从服务器出发,查看一下服务器的资源被啥占用了,有没有死锁或者竞争。
这个特别显著的特点就是:重启的mysql服务,刚开始执行查询并没有问题,过一会在执行就贼慢,不用犹豫,绝壁是服务器的问题导致的。
show PROCESSLIST 来观察线程的状态。
在排查的时候可以使用GDB作为堆栈跟踪,这个会阻塞住进程。当然gdb更适合调试那些你自己写的或者没有影响的进程,不然可能会造成问题,所以mysql服务器不太适合使用。但是gdb对其他东西的调试绝对是个很不错的选择。