我們收到了很多關於索引的問題。這一部分解答了其中的一小部分。有幾點要記住。
第一,mongodb索引和mysql索引非常相似並且對於mysql的索引優化有很多也適用於mongodb。
第二,更重要的是,這些索引的建議對你的應用提高也是有限的。
對於應用的最佳索引策略應該基於很多的重要因素。包含了你期望查詢的型別,
資料讀取與寫入的比率,甚至於你伺服器的空閒記憶體。意思就是,
需要對線上的產品做很多的測試剖析工作,才能調整出最佳的索引策略。
沒有什麼好的方法可以替代實際經驗的。
注意: 如果你是個新手,建議閱讀 read this introductory article first.
索引策略
下面有些索引的基本法則
建立的索引要匹配查詢。
如果你僅僅要查詢單個字段。索引這個字段即可。如
db.posts.find()
這個例子中,唯一索引是最佳的
db.posts.ensureindex(, );
然而,一般都查詢多個鍵並且排序結果。這種情況,組合索引是最佳的,例子如下
db.comments.find().sort();
建立的索引如下
db.comments.ensureindex();
要注意的是如果我們按照公升序排序created_at。索引效率就低下了。
每個查詢乙個索引。
有的時候查詢多個鍵,需要多個索引。在mongodb中,這麼做沒問題。
要確定所有的索引都在ram中。
shell中提供了乙個檢視索引大小的命令,如下:
db.comments.totalindexsize();
65443
如果你的查詢有點遲緩,你應該檢視下索引是否都存入到ram中了。
乙個例項,如果你執行在4gb的ram機器並且有3gb的索引,那麼索引可能並不能全存在ram中。
你需要新增ram以及/或者校驗實際的索引使用量。
要小心單鍵索引的低選擇性。
假使你有個字段叫做'status',就有兩個值new和processed。
如果在status上建立索引那麼這就是個低選擇性的索引。
意味著,查詢中沒有什麼優勢並且還佔大量的空間。
乙個更好一點的策略,當然依賴具體查詢需求,可以建立組合索引包括這個低選擇性的字段。
舉例來說,你可以建立乙個組合索引在status和created_at欄位上。
另乙個選擇,當然也依賴你的需求,可以分離collection, 乙個狀態乙個。
當然這些建議一定要進行測試,選擇最優的方案。
使用explain.
mongodb提供了乙個explain命令,
用來檢視查詢的過程並且可以檢視是否使用縮影。explain可以在驅動中使用,也可以在shell中使用:
db.comments.find().sort().explain();
返回了很多有用的資訊。包含了檢索的條數,消耗的毫秒數,優化器嘗試的索引以及最終所使用的索引。
如果你從來沒有使用過explain,請開始使用吧。
理解explain的 輸出.
explain輸出主要有三個字段:
這個很重要,因為,新增索引意味著新增,更新,刪除操作變慢。
如果你的應用是偏向於讀取,使用索引是非常好的事情。
但是如果你的應用偏向於寫,那麼建立索引就要小心了。增加索引都很影響寫入的效能。
一般來說,不要隨便新增索引。索引應該按照你的查詢來新增。
新增索引的理由總是很多的, 以及要進行大量的測試選擇合適的索引策略。
索引特性
組合索引有許多特性要記住。
下面的例子都假想在 a, b, c上建立組合索引。因此建立索引語句如下
db.foo.ensureindex()
1. 排序的列一定要在索引的最後。
好的: 不好的:
關於MongoDB中的索引查詢(查詢優化)
一 索引基礎 mongodb的索引幾乎與傳統的關係型資料庫一模一樣,這其中也包括一些基本的優化技巧。下面是建立索引的命令 db.test.ensureindex 可以通過下面的名稱檢視索引是否已經成功建立 db.test.getindexes 刪除索引的命令是 db.test.dropindex 在...
mongodb的索引相關
最近開始使用mongodb,用了一段時間後,發現有索引的需求。就把學習和使用過程寫下來。先使用mongodb的shell模式,然後再用python通過pymongo使用來試試。新建索引 db.collection.createindex 如 db.collection.createindex 索引型...
MongoDB索引的使用
索引通常能夠極大的提高查詢的效率,如果沒有索引,mongodb在讀取資料時必須掃瞄集合中的每個檔案並選取那些符合查詢條件的記錄。這種掃瞄全集合的查詢效率是非常低的,特別在處理大量的資料時,查詢可以要花費幾十秒甚至幾分鐘,這對 的效能是非常致命的。索引是特殊的資料結構,索引儲存在乙個易於遍歷讀取的資料...