回覆列表
  • 1 # 計算機科學論文導讀

    索引支援是MongoDB高效查詢的關鍵。如果沒有索引,MongoDB必須執行集合掃描(掃描集合中所有的文件),然後篩選匹配文件。MongoDB中的索引與其他資料庫系統中的索引類似。MongoDB在集合級別定義索引,並支援MongoDB集合中文件的任何欄位或子欄位定義索引。MongoDB 索引透過B-tree實現,查詢複雜度介於O(1)到 log n之間。MongoDB提供了許多不同的索引型別來支援特定型別的資料和查詢。

    單欄位索引:除MongoDB定義的_id索引外,MongoDB還支援在文件的單個欄位上建立使用者定義的升序/降序索引。複合索引:MongoDB支援使用者在多個欄位上定義索引,即複合索引。複合索引中欄位的順序很重要。如果複合索引為{ A: 1, B: -1 },則索引首先以A欄位進行排序,然後在每個A值以B欄位進行排序。多健索引:MongoDB使用多鍵索引來索引儲存在陣列中的內容。如果索引欄位包含陣列值,MongoDB會為陣列的每個元素建立單獨的索引條目。這些多鍵索引允許查詢透過匹配陣列中的元素來獲取包含陣列的文件。

    以下是MongoDB查詢最佳化的一些基本原則:

    在查詢條件、排序條件、統計條件的欄位上選擇建立索引,可以顯著提高查詢效率。必要時使用hint()強制使用某個索引查詢。只查詢要使用的欄位,而不查詢所有欄位。減少使用低效的運算子,如$where和$exists運算子,完全不能使用索引; $ne和$not運算子使用索引效率較低,甚至有時完全不用索引; $nin運算子總是會全表掃描.MongoDB在一次查詢中只能使用一個索引, 所以使用$or查詢多次在合併結果,不如單次查詢的效率高。考慮到資料分片,儘量減少跨分片查詢,比如儘量少用$in,$in會讓你的查詢去每一個分片上查一次,可以考慮在在每個分片上建索引。

    另外最最重要的是,MongoDB提供explain語句,可以獲取query語句的查詢計劃(queryPlanner)、以及執行過程中的統計資訊(executionStats)。MongoDB在解析完查詢之後,通常會產生幾個候選的查詢計劃,然後會為這些查詢計劃按照某個規則來打分,分數最高的查詢計劃就是合適的查詢計劃,這個查詢計劃裡面使用的索引就是系統認為合適的索引。所以,如果你的查詢太慢,可以檢視查詢計劃,看是否使用了你想要的索引,以及掃描的具體情況,其中統計資訊裡面有3個返回項,nReturned、totalKeysExamined、totalDocsExamined,分別代表該條查詢返回的條目、索引掃描條目、文件掃描條目。對於一個理想查詢,這三個值應該儘可能接近。

    最後,祝每個人的query查詢都快到起飛!

  • 中秋節和大豐收的關聯?
  • 請用簡潔的語言概括晏子使楚這個故事的大意?