# 性能剖析介绍
- 性能剖析是测量和分析时间花费在哪里的主要方法。
- 性能剖析一般有两个步骤:测量任务所花费的时间,然后对结果进行统计和排序,将重要的任务排到前面。
- 完成一项任务所需要的时间可以分为两部分:执行时间和等待时间。
- 值得优化的查询是那些占总响应时间比重大的,也就是说优化收益大的。
- 某些任务即使没有出现在性能剖析输出的前面也要优化,比如异常情况。
- 好的性能剖析工具应该显示可能的丢失时间,也就是任务的总时间和实际测量的时间之差。
- 性能剖析无法显示所有响应时间的分布,不能只相信平均值,可以使用直方图、百分比、标准差等来分析。
# 剖析 MySQL 查询
- 剖析服务负载
- 捕获慢查询日志,开启慢查询设置
- 分析慢查询日志,找到最慢的几个查询
- 剖析单条查询
- show profile
- set profiling = 1,设置开启剖析工具
- show prifiles,查询开启期间的所有查询的耗时,展示字段:Query_ID, Duration, Query
- show profile for query {Query_ID},详细分析 2 中耗时比较久的查询,展示字段:Status, Duration,按照顺序展示各个阶段的耗时,无法按照耗时排序,可以直接从 INFORMATION_SCHEMA.PROFILING 表中查询
- show status
- flush status,刷新计数
- show status,查看计数,展示字段:Varaible_name, Value,可通过 show status where Variable_name like 进行过滤
- 慢查询日志
- 分析会比 show profile 详细些
- 通过分析工具可查找慢查询在日志中的具体位置
- 可记录 show profile 和 show status
- Performance Schema
# 诊断间歇性问题
- 先确认是单条查询的问题,还是服务器的问题
- 服务器问题,可以升级到 MySQL 最新版
- 单条查询问题
- show global status,可以使用 mysqladmin 获取数据,分析每秒查询数,线程连接数,线程执行数等
- show processlist,可以观察是否有大量线程处于不正常的状态或者其他不正常的特征
- 使用查询日志,可以分析每个时间点的吞吐量等
- 捕获诊断数据
- 诊断触发器,即区分问题何时出现的方法
- 收集诊断数据的工具,在需要时间段内尽可能收集多的数据,如:系统的状态、CPU 利用率、磁盘使用率和可用空间、ps 的输出采样、内存利用率等,以及从 MySQL 获取的信息,如:show status、show processlist、show innodb status 等
- 解释结果数据,检查问题是否真的发生了,以及是否有非常明显的跳跃性变化