Mongodb

MongoDB 查詢優化器如何評估候選計劃?

  • May 23, 2019

MongoDB 查詢優化器處理查詢並在給定可用索引的情況下為查詢選擇最有效的查詢計劃

這是MongoDB 文件的摘錄。我正在尋找有關查詢優化器如何評估候選計劃的更多資訊。

  • 查詢優化器是否使用集合統計資訊?事實上,我們可以認為COLSCAN對於 1000 個文件的集合或具有 1 億個文件的集合的成本是不同的。
  • 當我們執行時explain("allPlansExecution"),我們會得到很多關於每個評估計劃的資訊。但是,在以下情況中,確定獲勝計劃的重要性順序的選擇標準是什麼?totalKeysExamined, totalDocsExamined, executionTimeMillis, nReturned, memUsage, 其他… ?

查詢優化器是否使用集合統計資訊?

查詢優化器(與 MongoDB 4.0 一樣)不使用集合統計資訊。

計劃評估基於比較給定查詢形狀的候選計劃,以查看哪個返回第一批結果(預設為 101 個文件)且總體“工作量”最少。works分數代表查詢階段(索引鍵比較、獲取文件等)中涉及的不同工作。如果多個計劃在評估期間執行相同的工作,則有一些小的平局獎勵可以幫助選擇要記憶體的計劃(例如,如果計劃是覆蓋查詢或不需要記憶體排序)。

獲勝計劃將被記憶體以供將來匹配相同查詢形狀的查詢使用,但如果性能隨時間下降或存在其他相關更改(例如,添加/刪除索引),則會重新評估。有關一般概述,請參閱MongoDB 文件中的查詢計劃

為了獲得常見查詢的最佳結果,您通常希望為您的查詢形狀提供一個理想的索引,而不是幾個競爭的候選索引。理想的索引將包括查詢中的欄位,並支持使用索引對查詢結果進行排序(如果您有排序條件)。對於一個工作範例,Optimizing MongoDB Compound Indexes部落格文章對閱讀很有幫助(注意:這使用了舊版本 MongoDB 的解釋輸出,但一般概念仍然適用)。

如果無法添加理想索引並且查詢優化器無法根據您的數據確定性地選擇最佳索引,您可以考慮使用索引提示來覆蓋查詢優化過程並強制使用特定索引。索引提示應謹慎使用,因為它們可能會強制進行次優選擇,並且會忽略將來添加的任何可能更合適的索引。

當我們執行 explain(“allPlansExecution”) 時,我們會得到很多關於每個評估計劃的資訊。但是,在以下情況中,確定獲勝計劃的重要性順序的選擇標準是什麼?totalKeysExamined, totalDocsExamined, executionTimeMillis, nReturned, memUsage, 其他… ?

從查詢評分的角度來看, works每個查詢階段的值是關鍵指標。類似totalKeysExaminedtotalDocsExamined的指標對於快速比較返回結果數量的效率非常有用 ( nReturned)。理想情況下,totalKeysExaminedto的比率nReturned應該是 1:1(每個結果的單個索引查找),但是一些複雜的查詢必須檢查更多的值。其他執行指標將根據查詢階段而有所不同,但這些可以提供works對該階段價值計算的洞察。對於更詳細的演練,我推薦閱讀 Charlie Swanson 的 .explain() 輸出展示文稿。

如果您想更好地了解特定查詢的執行統計資訊,我建議在 DBA StackExchange 上發布一個新問題,其中包含您的特定 MongoDB 伺服器版本和explain("allPlansExecution"). 您可能還會發現使用 MongoDB Compass 之類的 UI 工具進行調查很有幫助,該工具包括一個解釋輸出的視覺化樹,它比原始 JSON 更容易探索。

引用自:https://dba.stackexchange.com/questions/226675