跳至內容

如何對 Amazon RDS for MySQL 中的查詢緩慢問題進行疑難排解,並提高其效能?

3 分的閱讀內容
0

我想對 Amazon Relational Database Service (Amazon RDS) for MySQL 中的查詢緩慢問題進行疑難排解,並提高其效能。

簡短說明

在 Amazon RDS 中,以下問題可能導致查詢效能緩慢:

  • 工作負載與資源使用率問題,例如索引不足與緩衝集區使用效率不佳
  • 查詢執行計畫效率不佳
  • 資源爭用
  • 封鎖交易

若要解決這些問題,請查看 Amazon CloudWatch 指標、Performance Insights、Database Insights 以及 Enhanced Monitoring,以識別效能瓶頸。接著,解決瓶頸問題和最佳化查詢效能。

解決方法

重要事項:Performance Insights 將於 2026 年 6 月 30 日終止服務。您可以在 2026 年 6 月 30 日之前升級至 Database Insights 的進階模式。如果您未升級,使用 Performance Insights 的資料庫叢集會預設為 Database Insights 的標準模式。只有 Database Insights 的進階模式支援執行計畫與隨需分析。如果您的叢集預設為標準模式,您可能無法在主控台上使用這些功能。若要開啟進階模式,請參閱為 Amazon RDS 開啟 Database Insights 進階模式為 Amazon Aurora 開啟 Database Insights 進階模式

**注意事項:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

監控資源和資料庫效能

若要對查詢效能進行疑難排解,請查看 Amazon CloudWatch 指標,以確定問題原因。若要確定查詢何時增加特定資源的使用量或降低資料庫效能,請使用 CloudWatch 主控台或 AWS CLI 來監控以下指標

  • DatabaseConnections
  • NetworkReceiveThroughput
  • WriteThroughput
  • ReadThroughput
  • WriteLatency
  • ReadLatency
  • WriteIOPS
  • ReadIOPS
  • FreeStorageSpace
  • BurstBalance

如果您的資料庫效能不佳,請檢查 RDS 資料庫執行個體狀態,以確認是否是否存在可能影響效能的作用中或已排程的程序。此外,也查看您的 Amazon RDS 事件,以確認是否存在會影響資料庫效能的事件。

查看您的工作負載與資源使用率

如果您的查詢效能緩慢,請查看工作負載中的其他查詢,確認它們是否影響您的查詢效能。若要識別必須最佳化的查詢,您可以為 Amazon RDSAmazon Aurora 開啟 Database Insights 的進階模式。

如果您的執行個體重新啟動,資料庫執行個體可能會遺失快取資料,並導致查詢效能變慢。為避免此冷快取問題,請設定以下參數,以在重新啟動後加速緩衝集區的預熱:

  • innodb_buffer_pool_dump_at_shutdown
  • innodb_buffer_pool_load_at_startup
  • innodb_buffer_pool_dump_pct

若要最佳化查詢效能,最佳實務是監控資料庫執行個體對 InnoDB 緩衝集區的使用程度。如需更多資訊,請參閱 MySQL 網站上的緩衝集區。若要監控 InnoDB 緩衝集區的狀態,請查看以下 Performance Insights 的資料庫計數器

  • 若要查看邏輯讀取要求的數量,請查看 Innodb_buffer_pool_read_requests 計數器。
  • 若要查看 InnoDB 無法從緩衝集區滿足且必須直接從磁碟讀取的邏輯讀取數量,請查看 Innodb_buffer_pool_reads
  • 請使用 Innodb_buffer_pool_hit_ratio 查看 InnoDB 可從緩衝集區滿足讀取的百分比。
  • 請查看 Innodb_buffer_pool_usage,以查看包含資料頁面的 InnoDB 緩衝集區百分比。

若要辨識執行緩慢的查詢,您也可以在參數群組中啟用 slow_query_log,然後將日誌發佈到 CloudWatch Logs

最佳化查詢效能

若要最佳化查詢效能,請根據查詢執行計畫的要求執行以下命令。如需更多資訊,請參閱 MySQL 網站上的 EXPLAIN 輸出格式

使用 EXPLAIN 最佳化您的查詢

若要檢視查詢效能的更多資訊,以及查詢可能延遲的原因,請執行 EXPLAIN 命令。如需更多資訊,請參閱 MySQL 網站上的使用 EXPLAIN 最佳化查詢

若要確定您的查詢是否使用索引,請執行 EXPLAIN 查詢。在 EXPLAIN 輸出中,請查看資料表名稱、正在使用的索引鍵,以及查詢掃描的資料列數量。如需更多資訊,請參閱 MySQL 網站上的 EXPLAIN 陳述式。請查看輸出,然後採取以下動作:

  • 如果輸出未顯示正在使用的索引鍵,請在 WHERE 子句中的資料行上建立索引。
  • 如果資料表具有所需的索引,請確認資料表統計資料為最新狀態。如需更多資訊,請參閱 MySQL 網站上的 INFORMATION_SCHEMA STATISTICS 資料表

使用 ANALYZE TABLE 更新查詢統計資料

如果您的資料表統計資料不是最新狀態,查詢可能會出現效能不佳的情況。若要更新查詢統計資料,請執行 ANALYZE TABLE 命令。如需更多資訊,請參閱 MySQL 網站上的 ANALYZE TABLE 陳述式

使用 EXPLAIN ANALYZE 了解查詢如何配置時間

若要判斷查詢執行中哪個部分速度較慢,請執行 EXPLAIN ANALYZE 查詢,以檢視 MySQL 如何在您的查詢上配置時間。當查詢完成時,EXPLAIN ANALYZE 查詢會輸出執行計畫及其量測結果。如需更多資訊,請參閱 MySQL 網站上的 使用 EXPLAIN ANALYZE 取得資訊。您也可以使用 SHOW PROFILE 來分析執行較慢的查詢,並找出工作階段花費時間最多的狀態。如需更多資訊,請參閱 MySQL 網站上的 SHOW PROFILE 陳述式

使用 SHOW FULL PROCESSLIST 與 Enhanced Monitoring 查看作業

請執行 SHOW FULL PROCESSLIST 命令,以檢視在資料庫伺服器上執行的作業清單。您也可以使用 Enhanced Monitoring 來查看此清單。如需更多資訊,請參閱 MySQL 網站上的 SHOW PROCESSLIST 陳述式

檢查歷史清單長度

InnoDB 交易系統會維護多版本並行控制 (MVCC)。如果您的工作負載需要多個開啟中或長時間執行的交易,資料庫上的歷史清單長度會偏高。最佳實務是避免在資料庫上未結束或長時間執行交易。如需更多資訊,請參閱 InnoDB 歷史清單長度顯著增加

如果您未監控歷史清單長度的大小,效能會隨時間下降。較高的歷史清單長度也可能導致資源使用率偏高、緩慢且不一致的 SELECT 效能,以及儲存空間使用量增加。

**注意事項:**長時間執行的交易並非歷史清單長度暴增的唯一原因。如果清除執行緒無法跟上資料庫上的變更,歷史清單長度將保持在較高水準。在極端情況下,您也可能會遇到資料庫中斷。

SHOW ENGINE INNODB STATUS 命令會顯示關於交易處理、等待事件與鎖死的資訊。如需更多資訊,請參閱 MySQL 網站上的 SHOW ENGINE 陳述式。請執行 SHOW ENGINE InnoDB 狀態 查詢,以檢查您的歷史清單長度:

SHOW ENGINE INNODB STATUS;

範例輸出:

\------------ TRANSACTIONS ------------Trx id counter 26368570695  Purge done for
 trx's n:o < 26168770192 undo n:o < 0 state: running but idle History list length 1839

若要使用 Performance Insights 檢查歷史清單長度,請完成以下步驟:

  1. 開啟 Amazon RDS console (Amazon RDS 主控台)。
  2. 在導覽窗格中,選擇 Performance Insights,然後選取您要檢視指標的資料庫。
  3. 選擇 Metrics (指標)。
  4. 在「指標」儀表板頁面中,選擇 Custom dashboard (自訂儀表板)。
  5. 選擇 Add widget (新增小工具),然後選取 Trx Rseg History Len 指標。
  6. 選擇 Add widget (新增小工具)。

**注意事項:**如果資料操作語言 (DML) 寫入導致歷史清單長度增加,請要求資料庫管理員結束寫入查詢

解決遭封鎖的查詢

如果您的查詢執行時間過長,可能是另一個查詢封鎖了您的查詢。在 MySQL 8.0 中,您可以在 data_lock_waits 資料表的效能模式中找到鎖定等待。如需更多資訊,請參閱 MySQL 網站上的使用 InnoDB 交易與鎖定資訊。請執行以下查詢以識別封鎖交易:

SELECT
  r.trx\_id waiting\_trx\_id,    
  r.trx\_mysql\_thread\_id waiting\_thread,      
  r.trx\_query waiting\_query,    
  b.trx\_id blocking\_trx\_id,    
  b.trx\_mysql\_thread\_id blocking\_thread,    
  b.trx\_query blocking\_query    
FROM       performance\_schema.data\_lock\_waits w    
INNER JOIN information\_schema.innodb\_trx b    
  ON b.trx\_id = w.blocking\_engine\_transaction\_id    
INNER JOIN information\_schema.innodb\_trx r    
  ON r.trx\_id = w.requesting\_engine\_transaction\_id;

相關資訊

如何對顯示儲存空間已滿的 RDS for MySQL 或 MariaDB 執行個體進行疑難排解?

當沒有其他作用中的工作階段時,為什麼對 Amazon RDS for MySQL 資料庫執行個體的查詢會遭到封鎖?