

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 調校寫入工作負載
<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>

在多版本並行控制 (MVCC) 的 InnoDB 實作中，當修改記錄時，要修改的資料的目前 (舊) 版本首先記錄為復原日誌中的*復原記錄*。不斷增長的歷史記錄清單長度 (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 時，所有陳述式都會同步記錄，這可能會導致忙碌資料庫的效能下降。