2015-02-11 63 views
0

可以說,我有一個用戶集合,其中一個文件看起來像這樣索引策略應該支持哪些查詢是不同字段的組合?

{ 「名」: 「星爵」, 「時代」:24, 「性別」: 「男」, 「高度「:180, ‘重’:230, ‘愛好’:‘飛飛船’ }

現在,我希望有人能夠基於一個或多個域的搜索用戶。所以我按照上面的順序添加一個包含所有這些字段的複合索引。

問題是,當查詢字段是索引字段的前綴時,MongoDB索引工作效果很好。例如,如果我通過name,agegender查詢,則查詢的性能很好。如果我通過name,genderweight進行查詢,那麼查詢的性能不是很好(儘管它仍然使用索引並且比無索引更快)。

當你有這樣的用例時,你使用了什麼索引策略?

+0

您是否能夠解決有關索引策略的問題? – 2015-02-26 23:22:01

+0

我意識到,MongoDB不是這個用例的正確工具,並決定使用Elasticsearch – 2015-02-27 07:08:43

+1

好的。是的,ElasticSearch非常棒。我很高興你能解決你所面臨的問題。 – 2015-02-27 11:57:59

回答

0

如果您需要能夠查詢所有組合,則索引數量需要快速爆炸。該救援功能稱爲"index intersection"

在每個字段上創建一個簡單的索引並相信查詢優化器執行正確的索引交集。這個功能相對比較新(從2.6開始),而不像已知的RBDMSses那樣功能完整。跟蹤Jira Ticket for index intersections以瞭解限制是有意義的,因爲限制非常嚴重。仔細混合簡單索引(可以相交)和複合索引(用於非常常見的查詢)通常是有意義的。

在您的具體情況下,您可以利用許多字段爲數字並且有效值範圍非常有限(例如年齡,身高和體重)的事實。 gender字段具有較低的選擇性,不應在任何情況下進行索引。在最後一步中過濾性別,因爲它平均只會使必須處理的數據量增加一倍。

創建n!複合索引幾乎肯定不會n > 3一個選項...

+0

不幸的是,索引交集只適用於MongoDB 2.6中的兩個索引的交集。所以,如果我爲他們每個人都有單獨的索引,並且我的查詢包含字段'name'和'age',那麼它就可以工作。但是,如果它包含「名稱」,「年齡」和「性別」 - 它將不起作用。 – 2015-02-11 09:16:27

+0

是的。我稍微更新了答案。最後,目前還沒有解決這個問題的萬能解決方案。 – mnemosyn 2015-02-11 09:19:38

1

之所以查詢由nameagegender的偉大工程,同時通過namegenderweight查詢不會是因爲對於MongoDB中的複合索引,這些字段的順序非常重要,特別是索引的前綴。如文檔中的this page所述,複合索引可以支持對其字段的任何前綴進行查詢。因此,假設您按照您提供的字段順序創建索引,name,agegender的查詢是您的化合物索引的前綴,而namegenderweight只能利用索引的name部分。

支持在這些字段上查詢的所有可能的組合將需要您創建足夠的複合索引,以便所有可能的查詢都是索引的前綴。我會說這不是你想要做的事情。由於您的問題是針對具有多個字段的查詢編制索引策略,因此我建議您查看對您的數據集最有用的特定數據訪問模式,並創建一些支持這些模式的複合索引,以利用前綴概念和從索引中省略某些低基數的字段,如gender