Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  MySQL Performance Schema  /  Using the Performance Schema to Diagnose Problems

29.19 使用 Performance Schema 识诊问题

性能_schema 是一种工具,帮助 DBA 进行性能调优,通过实时测量而不是 盲猜。 本节将展示一些使用性能_schema 的方法。这里的讨论依赖于事件过滤,这在 第 29.4.2 节“性能_schema 事件过滤” 中有描述。

以下是一个方法论,用于分析可重复的问题,比如调查性能瓶颈。开始之前,你应该有一个可重复的用例,其中性能被认为 太慢 并需要优化,并且启用所有仪器(没有任何预过滤)。

  1. 运行该用例。

  2. 使用性能_schema 表格,分析性能问题的根本原因。这项分析主要依赖于后过滤。

  3. 对于排除在外的问题,禁用相应的仪器。例如,如果分析表明问题与特定存储引擎的文件 I/O 无关,则禁用该引擎的文件 I/O 仪器。然后清空历史和摘要表,以移除之前收集的事件。

  4. 重复步骤 1。

    在每次迭代中,性能_schema 输出,特别是 events_waits_history_long 表格,将包含越来越少的 噪音,由不相关仪器引起,并且由于该表有固定大小,它将包含越来越多与分析问题相关的数据。

    在每次迭代中,调查应该越来越接近问题的根本原因,因为 信号/噪声 比例提高,使得分析更容易。

  5. 一旦确定性能瓶颈的根源,就应该采取适当的纠正措施,比如:

    • 调整服务器参数(缓存大小、内存等)。

    • 通过编写它以不同的方式来优化查询。

    • 调整数据库架构(表格、索引等)。

    • 调整代码(这适用于存储引擎或服务器开发人员)。

  6. 从步骤 1 开始,再次运行,以查看更改对性能的影响。

mutex_instances.LOCKED_BY_THREAD_IDrwlock_instances.WRITE_LOCKED_BY_THREAD_ID 列对于调查性能瓶颈或死锁非常重要。这是由 Performance Schema 仪器提供的,方法如下:

  1. 假设线程 1 被阻塞,等待一个互斥量。

  2. 你可以确定线程正在等待什么:

    SELECT * FROM performance_schema.events_waits_current
    WHERE THREAD_ID = thread_1;

    说查询结果表明线程正在等待互斥量 A,这在 events_waits_current.OBJECT_INSTANCE_BEGIN 中找到。

  3. 你可以确定哪个线程持有互斥量 A:

    SELECT * FROM performance_schema.mutex_instances
    WHERE OBJECT_INSTANCE_BEGIN = mutex_A;

    说查询结果表明是线程 2 持有互斥量 A,这在 mutex_instances.LOCKED_BY_THREAD_ID 中找到。

  4. 你可以看到线程 2 在做什么:

    SELECT * FROM performance_schema.events_waits_current
    WHERE THREAD_ID = thread_2;