2011-05-06 107 views
46

我不明白pymongo中create_indexensure_index之間的區別。在MongoDB indexes page,它說Pymongo/MongoDB:創建索引或確保索引?

您可以通過調用 ensureIndex()

但是在pymongo有兩個不同的命令create_indexensure_index創建索引,併爲創建索引的文檔有:

與create_index()不同,它嘗試 無條件地創建索引, ensure_index()利用驅動程序內的某些 緩存,使其 只嘗試創建 可能尚不存在的索引。當PyMongo創建(或確保)索引 時, 在ttl秒內「記住」。 重複呼叫ensure_index() 在該時間限制內將是 輕量級 - 他們不會嘗試 實際上創建索引。

我說得對不對公衆在理解時ensure_index將創建一個永久索引,或者我需要使用create_index這個?

+0

在mongo 3.x中ensureIndex是** [不建議](http://stackoverflow.com/a/30314946/1090562)**,因此最好停止使用它。即使你仍然使用2.6版本,最好事先做好準備,並確保在未來的遷移中會有更少的意外。 – 2015-05-19 00:40:16

回答

13

請記住,在蒙戈3.X ensureIndex已被棄用,應該氣餒。

自3.0.0版開始不推薦使用:db.collection.ensureIndex()現在是db.collection.createIndex()的別名。

同樣是pymongo

棄用 - 確保在此集合存在的指標。

這意味着您應該始終使用create_index

3

全部索引是永久性的。 ensure_index()只是create_index()的一個小包裝。

「」「 的ensureIndex()函數只創建索引,如果它不存在。 ‘’」

有沒有像一個短暫的索引或臨時索引。

+1

我認爲這不太對。從mongodb shell調用'ensureIndex()'只會創建一個索引(如果它不存在)。但據我所知,從python接口調用'ensure_index()'方法將創建一個索引*或重建它,如果它最近沒有創建*。 – 2011-11-04 18:53:58

38

@安德烈亞斯榮就在那ensure_index()是一個包裝過create_index(),我覺得產生了困惑與短語:

當創建了索引(或保證) 通過PyMongo是「記憶「爲ttl 秒。

這並不是說該指數是暫時的還是「暫時」,什麼情況是,在指定的秒數,以ensure_index()呼叫試圖創造同一指數再次將有任何影響,將期間不是下面調用create_index(),但在「緩存」過期後,撥打ensure_index()再次呼叫create_index()下面。

我完全理解你的困惑,因爲坦率地說,PyMongo的文檔不會在解釋它是如何工作做了很好的工作,但如果你頭部到Ruby docs,對此的解釋是略知一二:

  • (字符串)ensure_index(規格,選擇採用= {})

呼叫CREATE_INDEX並設置一個標誌,以 不是另一個X分鐘再次這樣做。 這時候可以初始化蒙戈:: DB 對象作爲選擇,當被指定爲一個 選項[:cache_time的任何 變化爲指標將通過以下將會傳播 不管緩存時間 (例如,指數方向的改變)

此 方法的參數和選項與 Collection#create_index的參數和選項相同。

實例:

Call sequence:

Time t: @posts.ensure_index([['subject', Mongo::ASCENDING]) -- calls create_index and sets the 5 minute cache

Time t+2min : @posts.ensure_index([['subject', Mongo::ASCENDING]) -- doesn't do anything

Time t+3min : @posts.ensure_index([['something_else', Mongo::ASCENDING]) -- calls create_index and sets 5 minute cache

Time t+10min : @posts.ensure_index([['subject', Mongo::ASCENDING]) -- calls create_index and resets the 5 minute counter

我沒有聲稱司機工作完全一樣,只是爲了說明目的他們的解釋是一個更好的恕我直言。

9

交互式shell中的ensureIndex方法和python驅動程序中的ensure_index是不同的東西,雖然使用了相同的單詞。 Python驅動程序中的create_indexensure_index方法都會永久創建索引。

也許人們會在這種情況下使用ensure_index合理的TTL,因爲我不確定create_index是否每次調用它時都會重新創建索引。通常不需要休閒娛樂,這可能是一項沉重的操作。但是,即使ensure_index(python或ruby驅動程序)也可能在TTL過期時或者從不同客戶端實例或重新啓動後調用它時重新創建索引。我不確定這一點。

也許更好的可能性是首先使用方法index_information()檢查索引是否已經存在。如果它已經存在,則不會再創建它。

我現在演示術語ensure_index(或ensureIndex)如何使用兩個不同的含義:

1),如果它不存在於數據庫中

這是存在創建索引什麼交互Shell方法ensureIndex()做:

http://www.mongodb.org/display/DOCS/Indexes#Indexes-Basics

另外,Node.JS MongoDB Driver的行爲是這樣的:(文件collection.js在搜索function ensureIndex

https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js

2)創建索引,如果它不是在 '驅動緩存'

這裏使用了相同的標識符和不同的含義,這讓我感到困惑。

python和ruby驅動程序將關於最近創建的索引的信息存儲在內存中,他們稱這種行爲爲「緩存」。

他們不告訴數據庫有關此緩存。

這一機制的結果是,如果你打電話create_indexensure_index首次與TTL值(生存時間),那麼驅動程序將插入數據庫索引並會記住這個插入並存儲內存中的TTL信息。這裏緩存的是時間和索引。

你打電話ensure_index與同一驅動程序實例相同集合的相同指數下一次,該ensure_index命令只會再次插入索引,如果TTL秒尚未自第一次調用傳遞。

如果您致電create_index,索引將始終插入,無論第一次呼叫後經過多少時間,當然如果這是第一次呼叫。

這是Python的驅動程序,搜索def ensure_index文件collection.py在:

https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py

而且Ruby驅動程序,文件collection.rb在搜索def ensure_index

https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/collection.rb

(請注意,不同的客戶端實例不知道其他人的緩存,這些信息保存在mem中ory而且它是每個實例。如果您重新啓動客戶端應用程序,則新實例不知道舊的「緩存」索引插入。也有其他客戶不知道,他們不會告訴對方。)

我還不能完全理解,當數據庫中發生什麼,當python驅動程序或紅寶石驅動程序插入已經存在的索引。我懷疑他們在這種情況下什麼都不做,這更有意義,並且也會匹配Interactive Shell和JS驅動程序的行爲。

0

我會建議創建元類和ORM。 從元類初始化呼叫init_schema方法用於初始化計數器,模式鍵等 這樣,可以防止調用ensure_index每個查詢或集合更新:)