

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 调优写入工作负载
<a name="tune-write-workloads"></a>

实现负载均衡并释放写入器实例有助于您的写入工作负载在高峰期更好地执行。要在高并发下获得更好的写入性能，请执行以下额外的步骤。

## 将引用完整性移至应用程序层
<a name="referential-integrity"></a>

虽然引用完整性检查很重要，但是对于超大规模，它们可能会对您的负载造成不利影响。对于每次写入，必须在写入本身运行之前执行额外的扫描，这会导致性能下降。如果您的应用程序需要严格的完整性检查，请将其构建到应用程序层，以防止检查限制写入操作。

## 避免使用繁重的主键
<a name="primary-keys"></a>

保持主键轻便。InnoDB 存储引擎会将主键附加到您在表中创建的所有其他索引。当主键较大时，会影响索引的大小。如果主键很大，数据页的存储和检索速度会变慢。一个常见的例子是使用通用唯一标识符作为主键。如果要在超大规模环境中提高性能，这种方法并不可取。

## 使用分区交换将数据加载到分区表中
<a name="partition-exchange"></a>

如果要向分区表中写入大型数据集，[LOAD DATA FROM S3](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.LoadFromS3.html) 和[分区交换](https://dev.mysql.com/doc/refman/5.7/en/partitioning-management-exchange.html)的组合可以提高性能，因为插入操作不会访问主表。分区交换涉及数据定义语言（DDL），它在表上放置元数据锁。确保在表上运行的查询最少或没有查询时执行此操作，以便分区交换 DDL 无需等待即可获取元数据锁。交换只需几毫秒即可完成。

## 删除未使用的索引
<a name="unused-indexes"></a>

[InnoDB](https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html) 会根据数据的增长优化其查询计划，最好检查数据库中是否有未使用的索引并将其删除。当应用程序向表中写入数据时，未使用的索引会消耗 IO。检查未使用的索引列表，并确认它们不是在极少数情况下使用的索引，比如季度报告。另外，请注意，某些索引用于强制执行唯一性或排序，也必须予以考虑。

## 确保有效清除旧行版本
<a name="old-row-versions"></a>

在 InnoDB 的多版本并发控制（MVCC）实现中，当修改记录时，被修改数据的当前（旧）版本首先在撤消日志中记录为*撤消记录*。历史列表长度（HLL）值增长表示 InnoDB 垃圾回收线程（清除线程）无法跟上写入工作负载，或者清除被长时间运行的查询或事务阻止。当垃圾回收被阻止或延迟时，数据库可能会产生相当大的清除滞后，这可能会对查询性能产生负面影响。您可以使用以下建议来优化清除过程。
+ 减少事务。
+ 对于读取查询，请使用 READ COMMITTED 隔离级别。
+ 增加清除线程数（[innodb\_purge\_threads](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_purge_threads)）和（[innodb\_purge\_batch\_size](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_purge_batch_size)）。请注意，调优这些参数需要重新启动。
+ 定期监视 HLL，并解决任何阻碍垃圾回收进行的工作负载问题。

## 确保日志记录不会引起额外争用
<a name="logging"></a>

一般查询日志记录客户端连接和断开连接，服务器按接收顺序接收所有语句。激活后，日志记录同步进行，这可能会对繁忙的系统造成严重的性能损失。除非需要，否则我们建议停用一般日志。

慢速查询日志记录运行时间超过 [long\_query\_time](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_long_query_time) 秒数的语句，默认设置为 10 秒。当设置为 0 时，将同步记录所有语句，这可能会对繁忙的数据库造成性能损失。