2016-12-31 38 views
0

我學習的東西關於索引地塊和 找到一些東西在這裏enter link description hereMongoDB索引的內部實現?

索引支持MongoDB中查詢的執行效率。沒有 索引,MongoDB必須執行集合掃描,即掃描集合中的每個 文檔,以選擇與 查詢語句匹配的那些文檔。如果查詢存在適當的索引,MongoDB 可以使用該索引來限制它必須檢查的文檔數量。

我有一些查詢:

  1. 在創建索引使用(上的createIndex),都是有記錄一直保存在RAM ?
  2. 是否每次需要創建索引每當我的應用程序 要重新啓動?
  3. 在默認id(_id)的情況下會發生什麼。總是存儲在RAM中。

  4. _id是默認索引,這意味着所有記錄總是存儲在RAM的特定集合?

請幫助我如果我錯了。 謝謝

回答

3

我想,你有一個想法,索引存儲在RAM中。如果我說他們不是。

首先,我們需要了解什麼是索引,索引基本上是一個指示文件在磁盤上的位置的指針。就像我們在書中編入索引一樣,爲了更快地訪問,我們可以看到哪個主題在哪個頁面上。

所以當創建索引時,它們也存儲在磁盤中,但是當應用程序正在運行時,基於頻繁使用甚至更快的訪問,它們會被加載到RAM中,但加載和創建之間存在差異。

另外加載索引與將一個或一組記錄加載到RAM中不同。如果我們有索引加載,我們知道所有文件從磁盤中取出,不同於加載所有文件並驗證它們中的每一個。所以索引避免收集掃描。

創建索引是一次性過程,但是每次寫入文檔都可能會改變索引,因此可能需要重新計算某個部分,因爲可能會根據數據更改來刷新記錄。這就是爲什麼索引會使寫入變慢並且讀取速度很快。

再次想到作爲一本書,如果在本書之間添加說2頁的新主題,那麼需要重新計算該主題編號之後的所有索引。因此。

雖然創建索引使用(createIndex),是記錄總是存儲在RAM ?。

  • 沒有,記錄不存儲在RAM中,而創造這樣的處理集合中的所有文件,並創建一個索引頁,這將是一次理解耗時如果有太多的文件,這是爲什麼有一個選項可以在後臺創建索引。

時每次都需要創建索引每當我的應用程序要 重啓?

  • 指數創建了一個時間,你可以將其刪除並重新創建,但它不會重新創建應用程序或數據庫重啓。這對於在分片環境中大量收集來說是瘋狂的。

什麼將在默認ID(_id)的情況下發生的。總是存儲在 RAM中。

  • 同樣,這不是事實。 _id作爲索引字段,因此已經爲空集合創建索引,因爲當您執行寫操作時,它會重新計算索引。由於它是一個獨特的索引,處理速度會更快。

_id是默認的指數,這意味着所有記錄總是在RAM中的特定集合店?當您使用內存MongoDB中,我認爲當屬企業版的發動機

  • 所有記錄將只存儲在RAM中。由於索引,它不會自動將記錄加載到RAM中。
+1

如果你想預熱(上傳到RAM)你的索引當mongod開始時,你可以使用'db.runCommand({「touch」:,「data」:true,「index」:真})'。訪問不在內存中的索引條目效率特別低,因爲它通常會導致兩個頁面錯誤。將索引條目加載到內存中,然後再將另一個文檔加載到內存中有一個故障。當索引查找導致頁面錯誤時,它被稱爲btree未命中。 MongoDB還跟蹤btree命中:當索引訪問不必轉到磁盤時(來自MongoDB權威指南)。 –

+0

感謝您的評論,真的很有道理。 –

+0

@Rahul Kumar:好東西,我明白了,所有記錄都不存儲在RAM,RAM中總是存儲索引(基本上是一個指針),指向存儲在磁盤中的記錄? –