針對 Aurora MySQL 資料庫的查詢效能進行故障診斷 - Amazon Aurora

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

針對 Aurora MySQL 資料庫的查詢效能進行故障診斷

MySQL 透過系統變數提供查詢最佳化工具控制,這些變數會影響查詢計劃的評估方式、可切換最佳化、最佳化工具與索引提示,以及最佳化工具成本模型。這些資料點不僅可以比較不同的 MySQL 環境,還可以比較先前的查詢執行計劃與目前的執行計劃,以及了解 MySQL 查詢在任何時間點的整體執行。

查詢效能取決於許多因素,包括執行計劃、資料表結構描述和大小、統計資料、資源、索引和參數組態。查詢調校需要識別瓶頸並最佳化執行路徑。

  • 尋找查詢的執行計劃,並檢查查詢是否使用適當的索引。您可以使用 EXPLAIN 並檢閱每個計劃的詳細資訊,以最佳化查詢。

  • Aurora MySQL 第 3 版 (與 MySQL 8.0 Community Edition 相容) 使用 EXPLAIN ANALYZE 陳述式。EXPLAIN ANALYZE 陳述式是一種分析工具,可顯示 MySQL 在查詢上花費的時間和原因。透過 EXPLAIN ANALYZE,Aurora MySQL 會規劃、準備和執行查詢,同時計數資料列並測量在執行計劃的各個點所花費的時間。查詢完成時,EXPLAIN ANALYZE 會列印計劃及其測量結果,而不是查詢結果。

  • 使用 ANALYZE 陳述式來更新您的結構描述統計資料。由於統計資料過時,查詢最佳化工具有時可以選擇不佳的執行計劃。這可能會導致查詢效能不佳,因為資料表和索引的基數預估不正確。innodb_table_stats 資料表的 last_update 欄會顯示您的結構描述統計資料上次更新的時間,這是「過時」的良好指標。

  • 可能會發生其他問題,例如未考慮資料表基數的資料分佈扭曲。如需詳細資訊,請參閱 MySQL 文件中的估算 InnoDB 資料表的 ANALYZE TABLE 複雜性MySQL 中的直方圖統計資料

了解查詢所花費的時間

以下是判斷查詢所花費時間的方法:

分析

根據預設,分析已停用。啟用分析,然後執行緩慢查詢並檢閱其設定檔。

SET profiling = 1; Run your query. SHOW PROFILE;
  1. 識別花費最多時間的階段。根據 MySQL 文件中的一般執行緒狀態,讀取和處理 SELECT 陳述式的資料列通常是指定查詢生命週期中執行時間最長的狀態。您可以使用 EXPLAIN 陳述式來了解 MySQL 如何執行此查詢。

  2. 檢閱緩慢查詢日誌以評估 rows_examinedrows_sent,以確保工作負載在每個環境中都類似。如需更多詳細資訊,請參閱 記錄 Aurora MySQL 資料庫

  3. 針對屬於已識別查詢一部分的資料表執行下列命令:

    SHOW TABLE STATUS\G;
  4. 在每個環境上執行查詢之前和之後擷取下列輸出:

    SHOW GLOBAL STATUS;
  5. 在每個環境上執行下列命令,以查看是否有任何其他查詢/工作階段會影響此範例查詢的效能。

    SHOW FULL PROCESSLIST; SHOW ENGINE INNODB STATUS\G;

    有時,當伺服器上的資源忙碌時,它會影響伺服器上的所有其他操作,包括查詢。您也可以在執行查詢或設定 cron 任務時定期擷取資訊,以有用的間隔擷取資訊。

效能結構描述

效能結構描述提供有關伺服器執行時期效能的實用資訊,同時對該效能的影響最小。這與提供資料庫執行個體相關結構描述資訊的 information_schema 不同。如需更多詳細資訊,請參閱 Aurora MySQL 上 Performance Insights 的效能結構描述概觀

查詢最佳化工具追蹤

若要了解為何選擇特定查詢計劃執行,您可以設定 optimizer_trace 來存取 MySQL 查詢最佳化工具。

執行最佳化工具追蹤,以顯示最佳化工具及其選擇可用的所有路徑的廣泛資訊。

SET SESSION OPTIMIZER_TRACE="enabled=on"; SET optimizer_trace_offset=-5, optimizer_trace_limit=5; -- Run your query. SELECT * FROM table WHERE x = 1 AND y = 'A'; -- After the query completes: SELECT * FROM information_schema.OPTIMIZER_TRACE; SET SESSION OPTIMIZER_TRACE="enabled=off";

檢閱查詢最佳化工具設定

相較於 Aurora MySQL 第 2 版 (與 MySQL 5.7 Community Edition 相容),Aurora MySQL 第 3 版 (與 MySQL 8.0 Community Edition 相容) 有許多最佳化工具相關的變更。如果您有 optimizer_switch 的一些自訂值,建議您檢閱預設值的差異,並設定最適合工作負載的 optimizer_switch 值。我們也建議您測試 Aurora MySQL 第 3 版可用的選項,以檢查您的查詢如何執行。

注意

Aurora MySQL 第 3 版針對 innodb_stats_persistent_sample_pages 參數使用社群預設值 20。

您可以使用下列命令來顯示 optimizer_switch 值:

SELECT @@optimizer_switch\G;

下表顯示 Aurora MySQL 第 2 版和第 3 版的預設 optimizer_switch 值。

設定 Aurora MySQL 第 2 版 Aurora MySQL 第 3 版
batched_key_access off off
block_nested_loop on on
condition_fanout_filter on on
derived_condition_pushdown on
derived_merge on on
duplicateweedout on on
engine_condition_pushdown on on
firstmatch on on
hash_join off on
hash_join_cost_based on
hypergraph_optimizer off
index_condition_pushdown on on
index_merge on on
index_merge_intersection on on
index_merge_sort_union on on
index_merge_union on on
loosescan on on
materialization on on
mrr on on
mrr_cost_based on on
prefer_ordering_index on on
semijoin on on
skip_scan on
subquery_materialization_cost_based on on
subquery_to_derived off
use_index_extensions on on
use_invisible_indexes off

如需詳細資訊,請參閱 MySQL 文件中的切換最佳化 (MySQL 5.7)切換最佳化 (MySQL 8.0)。