本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
查詢執行緩慢
識別 - 找出問題
慢速執行查詢是超過您業務需求預期執行時間的查詢。構成慢查詢的定義會因不同的工作負載而有所不同。您可以透過分析器日誌或績效詳情來識別慢查詢。
-
如果尚未啟用,請啟用分析器。Profiler 日誌會寫入日誌群組下的 Amazon CloudWatch:
/aws/docdb/<cluster-identifier>/profiler。使用 CloudWatch Logs Insights 來查詢它們。取得電子商務產品集合 10 個最慢查詢的 CloudWatch 日誌分析查詢範例:
filter ns="ecommerce.products" | sort millis desc | limit 10 -
使用績效詳情近乎即時地識別昂貴的查詢。如果尚未啟用績效詳情,請將其啟用。
-
開啟 AWS 主控台,導覽至 Amazon Amazon DocumentDB,然後 Performance Insights,然後選取您的叢集執行個體。
-
檢閱資料庫載入 (AAS) 時間軸和熱門查詢 (依資料庫載入)。展開查詢摘要以檢視文字子陳述式。
-
擷取需要分析的查詢。
注意
並非所有績效詳情中的查詢都無效或緩慢查詢。
-
調查 — 收集資訊
-
分析工具提供與其相關聯的查詢執行計畫和關鍵指標,包括毫秒、Nreturned 和 planSummary (索引用量):
{ "op": "query", "ts": 1721374275673, "ns": "test.perf", "command": { "find": "perf", "filter": { "threadRunCount": 0 }, "$db": "test", "lsid": { "id": { "$binary": "oO2wEtpgQIK+y9KGByYnsw==", "$type": "4" } }, "$readPreference": { "mode": "secondaryPreferred" } }, "cursorExhausted": true, "nreturned": 0, "responseLength": 0, "protocol": "op_query", "millis": 137, "planSummary": "IXSCAN", "execStats": { "stage": "FETCH", "nReturned": "0", "executionTimeMillisEstimate": "100.346", "inputStage": { "stage": "IXSCAN", "nReturned": "0", "executionTimeMillisEstimate": "100.342", "indexName": "threadRunCount_1" } }, "client": "172.31.6.165:43154", "appName": "ProdAppTester14", "user": "adminuser" }若要尋找 COLLSCAN 查詢:
filter planSummary="COLLSCAN" | sort millis desc | limit 20 -
使用績效詳情來即時分析查詢執行趨勢,例如等待、載入和資源影響 (例如每個查詢的 IOPS 或 CPU)。
由於 Performance Insights 不提供查詢執行計畫,請擷取查詢,並在 Amazon DocumentDB 叢集上的查詢上執行 explain("executionStats"):
db.ecommerce.products.find().explain("executionStats") -
或者,將分析器指標與績效詳情資料建立關聯 (例如,將分析器中的高毫秒查詢與績效詳情中的常用查詢進行比對)。
診斷 — 尋找根本原因
在此步驟中,診斷查詢計畫以識別潛在的最佳化。使用下列流程 - 症狀 → 可能原因:
-
徵狀: planSummary: "COLLSCAN"
原因:索引遺失或不正確。
-
徵狀:使用 $group / $sort 緩慢彙總
原因:彙總管道可能正在處理記憶體中的過多資料。
-
徵狀:高延遲,而績效詳情會顯示依 IO 分組的資料庫負載等待,但會使用索引 (planSummary: "IXSCAN")。
原因:I/O 繫結查詢;索引或工作集超過執行個體上可用的緩衝區快取。
-
徵狀:PI 顯示 CPU 等待狀態,由於查詢很少,因此 AAS 很高
原因:CPU 繫結查詢 (複雜彙總、$regex)。
-
徵狀:許多緩慢的查詢,但沒有顯示昂貴的 planSummary
原因:外部瓶頸 (網路、限流、維護任務、查詢量)。
解決 — 修正問題
當您實作修正時,請務必使用 explain("executionStats") 驗證並監控 Performance Insights 資料庫負載。
-
planSummary:「COLLSCAN」
-
建立目標索引。
範例:針對依 { category, price } 篩選並依價格遞減排序的頻繁查詢:
db.products.createIndex({ category: 1, price: -1 })
-
-
使用 $group / $sort 緩慢彙總
-
提早推送 $match 和 $project,以減少流入 $group / $sort 的文件。
-
儘早限制管道中的欄位數量:
db.products.explain("executionStats").aggregate([ { $match: { category: "Electronics", price: { $gt: 0 } } }, // early filter { $project: { price: 1, category: 1 } }, // reduce document size { $group: { _id: "$category", avgPrice: { $avg: "$price" } } } ])
-
-
高延遲,而績效詳情顯示依 IO 分組的資料庫負載等待
-
驗證 BufferCacheHitRatio 是否低,或執行個體上的 ReadIOPS 是否高。增加執行個體記憶體 (升級執行個體類別,例如 r6g.large → r6g.xlarge) 或使用 NVMe 執行個體類別。
-
減少索引足跡。
-
新增僅供讀取複本以卸載讀取流量 (如果查詢可容忍最終一致性,請使用 readPreference 設定來重新導向複本上的流量)。
-
-
PI 顯示 CPU 等待狀態,由於查詢很少,因此 AAS 很高
-
以索引字首搜尋或 $text index 取代昂貴的 $regex。
-
批次寫入 (插入) 以減少寫入放大。
-
注意
在提升生產變更之前,請務必在較低的環境中測試您的變更 (非生產)。