

# Aurora MySQL 优化的基本概念
<a name="AuroraMySQL.Managing.Tuning.concepts"></a>

在优化 Aurora MySQL 数据库之前，请务必了解等待事件和线程状态及其发生的原因。同时，在使用 InnoDB 存储引擎时查看 Aurora MySQL 的基本内存和磁盘架构。有关有用的架构图，请参阅 [MySQL 参考手册](https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html)。

**Topics**
+ [Aurora MySQL 等待事件](#AuroraMySQL.Managing.Tuning.concepts.waits)
+ [Aurora MySQL 线程状态](#AuroraMySQL.Managing.Tuning.concepts.thread-states)
+ [Aurora MySQL 内存](#AuroraMySQL.Managing.Tuning.concepts.memory)
+ [Aurora MySQL 进程](#AuroraMySQL.Managing.Tuning.concepts.processes)

## Aurora MySQL 等待事件
<a name="AuroraMySQL.Managing.Tuning.concepts.waits"></a>

*等待事件*表示会话正在等待的资源。例如，等待事件 `io/socket/sql/client_connection` 表示线程正在处理新连接。会话等待的典型资源包括以下内容：
+ 例如，当会话试图修改缓冲区时，对缓冲区的单线程访问
+ 当前被另一个会话锁定的行
+ 已读取一个数据文件
+ 已写入一个日志文件

例如，为了满足查询，会话可能会执行完整的表扫描。如果数据尚未在内存中，会话将等待磁盘输入/输出完成。当缓冲区读取到内存时，会话可能需要等待，因为其他会话正在访问相同的缓冲区。数据库使用预定义的等待事件记录等待。这些事件按类别进行分组。

等待事件本身并不显示性能问题。例如，如果请求的数据不在内存中，则必须从磁盘读取数据。如果一个会话锁定行以进行更新，则另一个会话将等待解锁该行，以便它可以更新该行。提交需要等待对日志文件的写入完成。等待是数据库正常运行不可或缺的组成部分。

大量等待事件通常显示性能问题。在这种情况下，您可以使用等待事件数据来确定会话将时间花费在哪里。例如，如果通常在几分钟内运行的报告现在运行了数小时，则可以确定对总等待时间贡献最大的等待事件。如果您能确定顶级等待事件的原因，您有时就可以进行更改来提高性能。例如，如果您的会话正在等待已被另一个会话锁定的行，则可以结束锁定会话。

## Aurora MySQL 线程状态
<a name="AuroraMySQL.Managing.Tuning.concepts.thread-states"></a>

*常规线程状态*指的是与常规查询处理相关联的 `State` 值。例如，线程状态 `sending data` 表示线程正在读取和筛选查询的行以确定正确的结果集。

您可以使用线程状态以类似于使用等待事件的方式来优化 Aurora MySQL。例如，频繁发生 `sending data` 通常表示查询没有使用索引。有关线程状态的更多信息，请参阅 *MySQL 参考手册*中的[常规线程状态](https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html)。

使用性能详情时，以下条件之一为真：
+ 性能架构已开启 – Aurora MySQL 显示等待事件而不是线程状态。
+ 性能架构未开启 – Aurora MySQL 显示线程状态。

我们建议您配置性能架构以实现自动管理。性能架构提供了更多洞察和更好的工具来调查潜在的性能问题。有关更多信息，请参阅 [Aurora MySQL 上性能详情的性能架构概述](USER_PerfInsights.EnableMySQL.md)。

## Aurora MySQL 内存
<a name="AuroraMySQL.Managing.Tuning.concepts.memory"></a>

在 Aurora MySQL 中，最重要的内存区域是缓冲池和日志缓冲区。

**Topics**
+ [缓冲池](#AuroraMySQL.Managing.Tuning.concepts.memory.buffer-pool)

### 缓冲池
<a name="AuroraMySQL.Managing.Tuning.concepts.memory.buffer-pool"></a>

*缓冲池*是 Aurora MySQL 在其中缓存表和索引数据的共享内存区域。查询可以直接从内存访问常用的数据，而无需从磁盘读取。

缓冲池的结构为页面链接列表。一个*页面*可以容纳多个行。Aurora MySQL 使用最近最少使用的 (LRU) 算法将页面从池中排除。

有关更多信息，请参阅《MySQL 参考手册**》中的[缓冲池](https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html)。

## Aurora MySQL 进程
<a name="AuroraMySQL.Managing.Tuning.concepts.processes"></a>

Aurora MySQL 使用的流程模型与 Aurora PostgreSQL 截然不同。

**Topics**
+ [MySQL 服务器 (mysqld)](#AuroraMySQL.Managing.Tuning.concepts.processes.mysqld)
+ [线程](#AuroraMySQL.Managing.Tuning.concepts.processes.threads)
+ [线程池](#AuroraMySQL.Managing.Tuning.concepts.processes.pool)

### MySQL 服务器 (mysqld)
<a name="AuroraMySQL.Managing.Tuning.concepts.processes.mysqld"></a>

MySQL 服务器是一个名为 mysqld 的单个操作系统进程。MySQL 服务器不会产生额外的进程。因此，Aurora MySQL 数据库使用 mysqld 来执行其大部分工作。

当 MySQL 服务器启动时，它会侦听来自 MySQL 客户端的网络连接。当客户端连接到数据库时，mysqld 会打开一个线程。

### 线程
<a name="AuroraMySQL.Managing.Tuning.concepts.processes.threads"></a>

连接管理器线程将每个客户端连接与专用线程关联。该线程管理身份验证、运行语句并将结果返回到客户端。必要时，连接管理器会创建新线程。

*线程缓存*是一组可用的线程。连接结束时，如果缓存未满，MySQL 会将线程返回到线程缓存。`thread_cache_size` 系统变量决定了线程缓存的大小。

### 线程池
<a name="AuroraMySQL.Managing.Tuning.concepts.processes.pool"></a>

*线程池*由许多线程组组成。每个组管理一组客户端连接。当客户端连接到数据库时，线程池将以循环方式将连接分配给线程组。线程池将连接和线程分开。连接和运行从这些连接接收到的语句的线程之间没有固定的关系。