使用 Amazon RDS Optimized Reads 改善 RDS for MySQL 的查詢效能 - Amazon Relational Database Service

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

使用 Amazon RDS Optimized Reads 改善 RDS for MySQL 的查詢效能

您可以使用 Amazon RDS Optimized Reads,為 RDS for MySQL 實現更快的查詢處理。使用 RDS Optimized Reads 的 RDS for MySQL 資料庫執行個體或多可用區域資料庫叢集,相較於不使用它的情況,查詢處理速度最高可以快上 2 倍。

RDS Optimized Reads 的概觀

當您使用已開啟 RDS Optimized Reads 的 RDS for MySQL 資料庫執行個體或多可用區域資料庫叢集時,其可透過使用執行個體儲存體實現更快的查詢效能。執行個體儲存體為資料庫執行個體或多可用區域資料庫叢集提供暫時的區塊層級儲存空間。儲存體位於實際連接至主機伺服器的非揮發性記憶體儲存裝置 (NVMe) 固態硬碟 (SSD) 中。此儲存體已針對低延遲、高隨機 I/O 效能,以及高循序讀取輸送量進行最佳化。

當資料庫執行個體或多可用區域資料庫叢集使用資料庫執行個體類別搭配執行個體儲存體 (例如 db.m5d 或 db.m6gd) 時,預設會開啟 RDS Optimized Reads。使用 RDS Optimized Reads,部分臨時物件會存放在執行個體儲存體上。這些暫存物件包括內部暫存檔、內部磁碟上暫存資料表、記憶體對應檔案,以及二進位日誌 (binlog) 快取檔案。如需執行個體儲存體的詳細資訊,請參閱《適用於 Linux 執行個體的 Amazon Elastic Compute Cloud 使用者指南》中的 Amazon EC2 執行個體儲存體

在 MySQL 中產生臨時物件以進行查詢處理的工作負載,可以利用執行個體儲存體來加快查詢處理速度。這種類型的工作負載包括涉及排序、雜湊彙總、高負載聯結、一般資料表運算式 (CTE) 的查詢,以及未編製索引之資料欄上的查詢。無論用於持久性 Amazon EBS 儲存體的儲存體組態為何,這些執行個體儲存體都會提供更高的 IOPS 和效能。因為 RDS Optimized Reads 將臨時物件上的操作卸載至執行個體儲存體,所以持久性儲存體 (Amazon EBS) 的每秒讀寫次數 (IOPS)或輸送量現在可以用於持久性物件上的操作。這些操作包括一般資料檔案讀取和寫入,以及背景引擎操作,例如排清和插入緩衝區合併。

注意

手動和自動 RDS 快照都只包含持久性物件的引擎檔案。在執行個體儲存體中建立的臨時物件不會包含在 RDS 快照集中。

RDS Optimized Reads 的使用案例

如果您的工作負載嚴重依賴臨時物件 (例如內部資料表或檔案) 進行其查詢執行,則您可以從開啟 RDS Optimized Reads 中獲益。下列使用案例為 RDS Optimized Reads 的候選項目:

  • 使用複雜的一般資料表運算式 (CTE)、衍生資料表和群組操作來執行分析查詢的應用程式

  • 使用未最佳化查詢提供大量讀取流量的僅供讀取複本

  • 執行涉及複雜作業之隨需或動態報告查詢的應用程式,例如搭配 GROUP BYORDER BY 子句的查詢

  • 使用內部暫存資料表進行查詢處理的工作負載

    您可以監控引擎狀態變數 created_tmp_disk_tables,以判斷在資料庫執行個體上建立的磁碟型暫存資料表數目。

  • 直接或在程序中建立大型暫存資料表以儲存中繼結果的應用程式

  • 對未編製索引之資料欄執行分組或排序的資料庫查詢

RDS Optimized Reads 的最佳實務

請使用 RDS Optimized Reads 的下列最佳實務:

  • 針對唯讀查詢新增重試邏輯,以防這些查詢在執行期間由於執行個體儲存體已滿而失敗。

  • 使用 CloudWatch 指標 FreeLocalStorage 監控執行個體儲存體上的可用儲存空間。如果執行個體儲存體由於資料庫執行個體的工作負載而達到其限制,請修改資料庫執行個體,以使用較大的資料庫執行個體類別。

  • 當您的資料庫執行個體有足夠的記憶體,但仍達到執行個體儲存體或多可用區域資料庫叢集的儲存限制時,請增加 binlog_cache_size 值以在記憶體中維護工作階段特定的 binlog 項目。此組態可防止將 binlog 項目寫入至磁碟上的暫存 binlog 快取檔案。

    binlog_cache_size 參數是工作階段特有的。您可以變更每個新工作階段的值。此參數的設定可以在尖峰工作負載期間增加資料庫執行個體的記憶體使用率。因此,請考慮根據您應用程式的工作負載模式和資料庫執行個體上的可用記憶體來增加參數值。

  • 對於 MySQL 8.0 版和較低版本,請使用 binlog_format 參數的預設值 MIXED。根據交易的大小,將 binlog_format 設為 ROW 可能會在執行個體儲存體上產生大型 binlog 快取檔案。對於 MySQL 8.4 和更高版本,請使用 binlog_format 參數的預設值 ROW

  • internal_tmp_mem_storage_engine 參數設為 TempTable,然後設定 temptable_max_mmap 參數,以符合執行個體儲存體上可用儲存體的大小。

  • 避免在單一交易中執行大量變更。這些類型的交易可能會在執行個體儲存體上產生大型 binlog 快取檔案,並在執行個體儲存體已滿時產生問題。請考慮將寫入分割成多個小型交易,以將 binlog 快取檔案使用的儲存體減至最少。

  • ABORT_SERVER 的預設值用於 binlog_error_action 參數。這樣做可避免在啟用備份的資料庫執行個體上進行二進位記錄時發生問題。

使用 RDS Optimized Reads

當您在單一可用區域資料庫執行個體部署、多可用區域資料庫執行個體部署或多可用區域資料庫叢集部署中,佈建具有下列其中一個資料庫執行個體類別的 RDS for MySQL 資料庫執行個體時,資料庫執行個體會自動使用 RDS Optimized Reads。

若要開啟 RDS Optimized Reads,請執行下列其中一項:

  • 使用其中一個資料庫執行個體類別,建立 RDS for MySQL 資料庫執行個體或多可用區域資料庫叢集。如需詳細資訊,請參閱 建立 Amazon RDS 資料庫執行個體

  • 修改現有的 RDS for MySQL 資料庫執行個體或多可用區域資料庫叢集,以使用其中一個資料庫執行個體類別。如需詳細資訊,請參閱 修改 Amazon RDS 資料庫執行個體

RDS Optimized Reads 適用於支援其中一或多個具有本機 NVMe SSD 儲存體的資料庫執行個體類別之所有 AWS 區域 RDS。如需資料庫執行個體類別的相關資訊,請參閱 資料庫執行個體類別

資料庫執行個體類別的可用性因 AWS 區域而異。若要判斷特定的 AWS 區域 是否支援資料庫執行個體類別,請參閱 在 中判斷資料庫執行個體類別支援 AWS 區域

如果您不想要使用 RDS Optimized Reads,請修改資料庫執行個體或多可用區域資料庫叢集,以便其不使用支援該功能的資料庫執行個體類別。

監控使用 RDS Optimized Reads 的資料庫執行個體

您可以透過下列 CloudWatch 指標,監控使用 RDS Optimized Reads 的資料庫執行個體:

  • FreeLocalStorage

  • ReadIOPSLocalStorage

  • ReadLatencyLocalStorage

  • ReadThroughputLocalStorage

  • WriteIOPSLocalStorage

  • WriteLatencyLocalStorage

  • WriteThroughputLocalStorage

這些指標提供可用執行個體儲存體、IOPS 和輸送量的相關資料。如需這些指標的詳細資訊,請參閱 Amazon RDS 的 Amazon CloudWatch 執行個體層級指標

RDS Optimized Reads 的限制

下列限制適用於 RDS Optimized Reads:

  • 下列版本支援 RDS Optimized Reads:

    • RDS for MySQL 8.0.28 版和更高的主要與次要版本

    如需 RDS for MySQL 版本的相關資訊,請參閱 MySQL on Amazon RDS 版本

  • 您無法在支援 RDS Optimized Reads 的資料庫執行個體類別上,將臨時物件的位置變更為持久性儲存體 (Amazon EBS)。

  • 在資料庫執行個體上啟用二進位記錄時,交易大小上限受執行個體儲存體的大小限制。在 MySQL 中,任何需要儲存體超過 binlog_cache_size 寫入交易值的工作階段,都會變更為暫存 binlog 快取檔案,這些檔案是在執行個體儲存體上建立的。

  • 執行個體儲存體已滿時,交易會失敗。