2014-03-07 38 views
0

我正在做一個_id的範圍查詢,並且需要從找到的文檔中僅返回一個特定字段(「數據」)。我想只爲了獲得最佳性能而使此查詢索引。如何在MongoDB中有效地添加帶有_id字段的複合索引

下面是查詢:

db.collection.find({_ ID:{$ GTE: 「C」,$ LTE: 「d」}},{_ ID:0,數據:1} )

此查詢當然並不indexOnly所以我需要添加另一個索引:

db.collection.ensureIndex({_ ID:1,數據:1})

,並告訴MongoDB的使用該指數具有:

db.collection.find({_ ID:{$ GTE: 「C」,$ LTE: 「d」}},{_ ID:0,數據: 1})提示({_ ID:1,數據:1})

(該提示是必要的,因爲否則的MongoDB將使用標準的_id索引進行查詢)

這按預期工作和使查詢indexOnly。但是,即使不再需要它,也不能刪除標準_id索引,這會導致雙倍索引浪費大量空間。在查詢中被迫總是使用hint()也很煩人。

所以我想知道是否有更聰明的方法來做到這一點。

+1

據我所知不。要使用覆蓋索引,所有字段必須在其中。另外,不可能刪除單個_id索引。儘管如此,除非你的數據庫是可怕的,否則_id索引的大小應該是你的問題中最小的。 – joao

回答

0

我不相信有什麼辦法可以做你想做的。 The _id index cannot be removed,並且您需要擁有第二個索引才能對數據執行覆蓋(indexOnly)查詢。

你真的需要只有一個索引嗎?我懷疑你可能只需要增加速度或減少磁盤使用量,但不能同時滿足這兩個要求。如果您確實需要提高速度並減少磁盤使用量,則可能需要尋找其他數據庫解決方案,因爲用於加速MongoDB查詢(索引,覆蓋查詢,分片等)的所有技術傾向於交易增加了磁盤使用量,以獲得它們提供的速度提升。

編輯:

而且,如果呼叫暗示是竊聽你,你也許可以把它關閉,因爲MongoDB的最終re-optimize it's query plan此時它會切換到新的索引,如果它真的是快。

相關問題