簡體   English   中英

mongodb - 涉及公共字段的多個復合索引

[英]mongodb - Multiple Compound Indexes involving a common field

我們有一個包含數百萬數據的集合。 此數據出於統計目的在 UI 中呈現,因此呈現時間至關重要。

呈現數據的查詢涉及以下字段:

  1. field_a 和 field_t
  2. field_b 和 field_t
  3. field_c 和 field_t

由於我們正在查詢數百萬條數據,因此我們希望使用復合索引來加快查詢速度。

為此,我們可以簡單地添加 3 個不同的復合索引,如下所示:

db.mycollection.createIndex( { "field_a": 1, "field_t": 1 }
db.mycollection.createIndex( { "field_b": 1, "field_t": 1 }
db.mycollection.createIndex( { "field_c": 1, "field_t": 1 }

在創建索引時遵守 ESR 規則,因為 field_a、field_b 和 field_c 是相等性檢查,而 field_t 是范圍檢查。 請注意 field_t 在所有 3 個索引中都是通用的。

除了創建 3 個不同的索引,是否有更好的方法?

mongo 是否提供了一種更有效的方法來處理在多個復合索引中使用相同字段的情況?

在哪些方面更好或更有效率?

就查詢性能而言,擁有您提到的三個索引是最有效的方法。 它們將允許數據庫只處理與每個查詢相關的數據,而不處理其他任何數據。 任何其他方法都會降低讀取效率(和速度),這可能不是一個好的權衡。

大多數數據庫,包括 MongoDB,在執行查詢時通常使用單個索引。 這主要是索引工作方式的結果。 通常索引使用類似 B 樹的數據結構,這是一組有序的信息。 當遵循 ESR 規則(將相等條件放在范圍條件之前)時,特定查詢的所有信息都包含在索引中可以直接遍歷的單個有界子樹中。 當索引不是以這種方式構建時(包括將范圍鍵放在首位),它就失去了執行此操作的能力。

使用單字段索引的其他潛在方法是:

  • 索引交集——在這里創建(在本例中)4 個單字段索引並讓數據庫為每個查詢使用 2 個。 MongoDB 通常不會經常選擇這種方法,因為與上面的復合索引方法相比,它會導致掃描索引的更大部分。
  • 為每個查詢使用一個單一字段索引——數據庫最終會檢索文檔以在另一個字段上進行過濾,這可能非常低效,具體取決於另一個字段的選擇性。

雖然這些可能會減少集合索引的總體大小,但會增加執行查詢的成本(並降低效率)。 根據您要優化的內容,您概述的方法將被視為查詢效率方面的最佳實踐。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM