我想要疑難排解 Amazon DocumentDB (with MongoDB compatibility) 叢集中執行緩慢的查詢,以改善效能。
解決方法
由於以下原因,您在 Amazon DocumentDB 叢集中可能會遇到查詢執行緩慢的情況:
- 硬體規格不足
- 工作負載變更
- 流量增加
- 記憶體問題
- 查詢計畫未最佳化
監控您的工作負載
若要了解資料庫效能問題的根本原因,請檢查您的執行個體所使用的所有全伺服器資源。監控您的工作負載,並調查查詢效能在何時處於最佳狀態,以及查詢從何時開始需要很長時間才能執行。
使用 Amazon CloudWatch 指標
使用適用於 Amazon DocumentDB 的 CloudWatch 指標來分析您的叢集效能。若要找出因資源不足而造成的效能瓶頸,請使用 CPUUtilization 和 FreeableMemory 等指標。若要了解記憶體最佳化情況,請使用 BufferCacheHitRatio 和 LowMemNumOperationsThrottled 等指標。
監控作業層級指標,以了解您執行個體上的工作負載。實用的指標包括 DocumentsInserted、DocumentsReturned、DocumentsDeleted 和 TransactionsAborted。如需更多資訊,請參閱監控 Amazon DocumentDB (with MongoDB compatibility) 叢集的指標並設定警示。
使用 Performance Insights
使用 Performance Insights,依等待、查詢、主機、資料庫和應用程式等面向來評估您的資料庫工作負載。擷取計數器和詳細查詢資訊,並評估哪些查詢對資料庫負載的貢獻最大。高於 Max vCPU 值的資料庫負載表示執行個體類別上的工作負載已受到限流。分析查詢文字,以協助您調整查詢。
使用 Profiler 日誌
使用 Amazon DocumentDB Profiler 來記錄在叢集上執行之作業的執行時間和詳細資訊。Profiler 可讓您監控叢集上最慢的作業。這有助於您改善個別查詢效能和整體叢集效能。
使用資料庫方法
定期在您的 Amazon DocumentDB 執行個體上執行以下 currentOp() 命令,以監控一段時間內的系統使用情況:
db.adminCommand({currentOp: 1, $all: 1});
若要計算系統中每個命名空間內的查詢和作業數量,請執行以下命令:
db.adminCommand({
aggregate: 1,
pipeline: [
{
$currentOp: {
allUsers: true,
idleConnections: true
}
},
{
$group: {
_id: {
desc: "$desc",
ns: "$ns",
WaitState: "$WaitState"
},
count: {
$sum: 1
}
}
}
],
cursor: {}
});
執行命令後,請分析系統使用結果,以了解系統上的負載並採取適當動作。
最佳化您的查詢
找出長時間執行的查詢後,請調整查詢以改善查詢效能。
使用正確的查詢規劃器
若要改善效能,請使用最佳索引計畫,並為您的運算子啟用索引掃描支援。對於 Amazon DocumentDB 5.0 版及更新版本,請使用規劃器版本 2.0,以利用進階查詢規劃器來最佳化 find、update、delete 和 find-and-modify 命令等基礎作業。對於未選取最佳索引的特定查詢模式,此功能會新增對計畫快取篩選條件功能的支援,讓您能夠為特定查詢形狀指定索引清單。
分析查詢的統計資料
若要最佳化查詢效能,請使用 executionStats 來分析查詢的執行方式。executionStats 會提供每個查詢階段處理的文件數、每個階段的執行時間,以及產生查詢計畫時進行的嘗試次數。
若要查看查詢的統計資料,請執行以下命令:
query.explain("executionStats");
範例作業:
db.collection.find({}).limit(2).explain("executionStats");
上述範例作業會分析當您嘗試尋找兩份文件時,查詢的執行情況。
檢閱傳回的統計資料。您可以新增索引以減少完整集合掃描,並限制查詢必須掃描的文件數量。最佳實務是測試任何新索引並評估效能。使用複製或快照還原選項來建立測試環境。
檢查執行個體中是否存在低效率索引
每個索引都會在您的資源上增加額外的寫入延遲、CPU 使用量、I/O 作業,以及整體已使用的儲存空間。雖然索引可以改善查詢效能,但最佳實務是定期檢閱索引並移除未使用的索引。
若要查看每個索引的存取頻率明細,請執行與以下範例類似的命令:
db.collection.aggregate([{$indexStats:{}}]).pretty()
若要查看使用索引執行的掃描 (索引掃描) 總數,請執行以下命令:
db.collection.stats()
將前述查詢的計數與未使用索引執行的掃描數量 (集合掃描) 進行比較。然後分析作業在存取集合時使用索引的頻率。
關閉執行個體上的非使用中游標
Amazon DocumentDB 執行個體對特定時間可開啟的作用中游標數量設有限制。您使用的執行個體類型會決定此限制。如需更多資訊,請參閱執行個體限制。使用 CloudWatch 監控 CloudWatch 中的 DatabaseCursors 指標,以檢閱已開啟游標的數量。
若要查看開啟游標的更多詳細資訊,請執行與以下範例類似的命令:
db.runCommand("listCursors")
最佳實務是在使用完游標後關閉游標,可避免限流。閒置游標會使用 CPU 和記憶體來監控與其相關聯的佇列。
相關資訊
疑難排解效能和資源使用率