MySQL查询性能问题排查

2020-01-04  本文已影响0人  Karl90

Mysql数据库的性能问题排查是十分复杂的,具体方法视场景而定,这里只做大致思路分析。

1. 整体考虑导致查询性能低下的各种因素

导致SQL查询变慢的原因是多元化的,在遇到问题时首先要有一个全方位的思考:

2. 剖析MySQL查询

1. 剖析服务器负载

2. 剖析单条查询

​ 在定位到需要优化的单条查询后,可以根据此查询获得更多信息。以下是一些剖析方法:

3. 诊断间接性问题

尽量不要使用试错的方式解决问题,而是应该在有问题发生的地方通过观察资源的使用情况并尽可能测量数据。

1. 确定是单条查询问题还是服务器问题

  • 若果服务器上所有程序都突然变慢,又突然变好,每一条查询也都变慢了,那么慢查询可能就不一定是原因。
  • 老版本MySQL对高配置服务器(多CPU)支持不好,新版本相对好些。此时可通过升级MySQL版本来解决问题。

下面是解决间接性问题的方法和工具:

  • 以较高频率执行SHOW GLOBAL STATUS
  • 以较高频率执行SHOW PROCESSLIST
  • 使用查询日志
  • gnuplotR等绘图工具将结果绘制成图形帮助分析

2. 捕获诊断数据

当出现间接性问题时,需要尽可能多地收集数据,而不只是出现问题时的数据。

  • 诊断触发器

    • 是问题出现时能捕获数据的基础。
    • 误报和漏检可能导致无法达到预期的结果。
    • 监控服务器,当达到触发条件时能收集数据的工具:pt-stalk
  • 确定需要收集什么样的数据

    • 在需要的时间段内尽可能地收集所有能收集的数据。

    • 执行时间包括工作时间和等待时间。

    • 用于服务器内部诊断的重要工具oprofile

    • 可以使用strace剖析服务器的系统调用。(生产环境中有一定风险)

      • 有一些不可预期性
      • 开销大
      • 使用的是实际时间
      • 对mysqld这样有大量线程场景会产生一些副作用,导致mysqld运行非常慢
    • 可以使用tcpdump剖析查询。

    • 可以使用GDB的堆栈跟踪进行对等分析。(具有侵入性,会暂时造成服务器停顿)

    • 可以使用SHOW PROCESSLISTSHOW INNODB STATUS的快照信息观察线程和事务的状态进行等待分析。

    • 可以使用pt-collect工具收集数据,一般通过pt-stalk调用。

3. 解释结果数据

如果已经正确设置好触发条件,并且长时间运行pt-stalk,则只需要等待足够长的时间来捕获几次问题,就能得到大量数据进行筛选。

建议根据两个目的来查看:

  1. 检查问题是否真的发生了。
  2. 是否有非常明显的跳跃性变化。

查看异常的查询和事务的行为,以及异常服务器内部行为通常都是最有效的。通过抓取TCP流量或SHOW PROCESSLIST输出,可以获得查询和事务出现的地方,从而知道用户对数据库进行了什么操作。服务器内部行为可在oprofile或者gdb的输出中看到。

  • 查看异常的查询和事务的行为,可以显示是否由于使用服务器的方式导致的问题:
    • 性能低下的SQL查询
    • 使用不当的索引
    • 设计糟糕的数据库逻辑架构
  • 通过服务器的内部行为:
    • 可以清楚服务器是否有BUG
    • 内部的性能和扩展性是否有问题

pt-mysql-summarypt-summary这两个工具会输出MySQL的状态和配置信息,以及操作系统和硬件信息。

pt-sift是一款快速检查收集到的样本数据的工具。

gdb的堆栈追踪是重要的等待分析的性能瓶颈分析工具:

  • 需要自下而上来看。
  • 将很多信息聚合在一起来看。

穷人剖析器poor man's profiler

如何高性能的使用MySQL呢?

1. 设计最优的库表结构

2. 建立最好的索引并实际应用

3. 设计合理的SQL

上一篇下一篇

猜你喜欢

热点阅读