## 27.19使用性能模式诊断问题

[27.19.1使用性能模式进行查询分析](performance-schema-query-profiling.html)
[27.19.2获取家长事件信息](performance-schema-obtaining-parent-events.html)

[](<>)[](<>)

性能模式是一种工具，可以帮助DBA进行性能调整，方法是进行实际测量，而不是“胡乱猜测”本节演示了为此目的使用性能模式的一些方法。这里的讨论依赖于事件过滤的使用，如中所述[第27.4.2节，“性能模式事件筛选”](performance-schema-filtering.html).

以下示例提供了一种方法，可用于分析可重复的问题，例如调查性能瓶颈。首先，您应该有一个可重复的用例，其中性能被认为“太慢”，需要优化，并且您应该启用所有检测（根本没有预过滤）。

1.  运行用例。

2.  使用性能模式表，分析性能问题的根本原因。这种分析在很大程度上依赖于后期过滤。

3.  对于排除的问题区域，禁用相应的仪器。例如，如果分析显示问题与特定存储引擎中的文件I/O无关，请禁用该引擎的文件I/O工具。然后截断历史记录和摘要表，以删除以前收集的事件。

4.  重复步骤1中的过程。

    在每次迭代中，性能模式输出，尤其是[`事件等待历史漫长`](performance-schema-events-waits-history-long-table.html)表中包含了越来越少的由非重要仪器引起的“噪音”，并且由于该表具有固定的大小，因此包含了越来越多与手头问题分析相关的数据。

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

5.  一旦发现性能瓶颈的根本原因，采取适当的纠正措施，例如：

    -   调整服务器参数（缓存大小、内存等）。

    -   通过编写不同的查询来调整查询，

    -   调整数据库模式（表、索引等）。

    -   调整代码（这仅适用于存储引擎或服务器开发人员）。

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

    这个`互斥实例。被线程ID锁定`和`rwlock_实例。通过线程ID写入锁定`列对于调查性能瓶颈或死锁非常重要。这是通过性能模式检测实现的，如下所示：

7.  假设线程1被困在等待互斥锁。

8.  您可以确定线程正在等待什么：

    ```
    SELECT * FROM performance_schema.events_waits_current
    WHERE THREAD_ID = thread_1;
    ```

    假设查询结果标识线程正在等待互斥锁A，在`事件等待当前事件。对象\u实例\u开始`.

9.  您可以确定哪个线程持有互斥锁A：

    ```
    SELECT * FROM performance_schema.mutex_instances
    WHERE OBJECT_INSTANCE_BEGIN = mutex_A;
    ```

    假设查询结果确定线程2持有互斥锁A，如中所示`互斥实例。被线程ID锁定`.

10. 您可以看到线程2正在做什么：

    ```
    SELECT * FROM performance_schema.events_waits_current
    WHERE THREAD_ID = thread_2;
    ```
