2011-12-27 73 views
3

我有一個存儲項目(例如web文檔)的應用程序。每個項目可以包含任意大量的標籤。典型的常見查詢是使用給定的標籤集檢索所有文檔。那麼,一個很常見的Web應用程序。NoSQL:索引和基於關鍵字的搜索

現在我正在考慮將NoSQL數據庫作爲持久存儲。各種NoSQL系統(例如MongoDB)支持輔助索引和基於關鍵字的搜索。顯示如何在不同系統中執行操作的示例很容易找到。問題是,我想知道「底層」中發生了什麼,即二級索引如何/在哪裏存儲,以及如何實際執行帶有一列標記的查詢。特別是在有許多節點的系統中。

我知道基於Map/Reduce或類似的解決方案。但在這裏我很感興趣的索引工作。例如,我有的問題是:

  • 輔助索引是否僅存儲項目/對象ID或更多?
  • 如果一個查詢包含k個標籤,是否有k個子查詢 - 每個標籤一個 - 執行並且k個部分結果合併成一個起始節點?

哪裏可以找到不同NoSQL系統的這種信息?非常感謝任何提示。

基督教

回答

2

在MongoDB中對標籤的索引將通過利用多鍵特徵,由此數據庫嘗試匹配的文件對一個陣列的每個元素來完成。您可以對給定文檔的這個標籤屬性進行索引,該屬性將創建一個構建超出該數組中標籤範圍的btree。

您可以瞭解更多關於multikeys here,可以通過觀看這個演示獲取有關MongoDB的索引的更多信息:MongoDB Internals

是否二級索引只存儲項目/對象ID或以上?

索引由索引字段組成(可以說它是一個標籤數組,在你的情況下,那麼這個字段將是一個標籤)和一個偏移量,用於在內存中有效地定位文檔。它也有一些填充+其他開銷如上所述here

如果一個查詢包含k個標籤,k個子查詢 - 每個標籤一個 - 執行並且k個部分結果組合起來一個發起節點?

這取決於,但是,如果,例如,查詢使用$或標記字段我認爲查詢是並行執行的,每個在O(log n)時間,結果合併形成結果集,但我不確定這一點,但。

+1

嗨泰勒,感謝您的回覆和鏈接。演示文稿確實很有趣,也許有點太內部:)。我現在發現的是(至少)MongoDB爲索引應用了基於文檔的分區,即每個節點/分片/?維持它自己的本地索引。多條查詢然後被髮送到所有(?)節點並在本地處理。 (在我的第二個問題中描述的替代方法更適用於全局索引,即索引的基於術語的分區)。基督教再次感謝您的幫助 – Christian 2011-12-29 08:58:27