關於設計mongodb索引,涉及到記憶體排序問題解決

2021-10-12 03:17:09 字數 2015 閱讀 7255

關於設計mongodb索引,涉及到記憶體排序問題解決

查詢指令碼如下:

db.quickreplytemplate.find().sort().explain("executionstats");
很簡單乙個查詢,然後我們需要設計兩個索引,看看mongodb執行器對這兩個索引如何選擇優化?

db.getcollection("quickreplytemplate").createindex(, );
db.getcollection("quickreplytemplate").createindex(, );
兩個很簡單是索引,並且區別很明顯,後者多了乙個updateon引數,然後這個引數就是排序引數,我們看看執行計畫

// 1

},},}]

},"winningplan": ,

"indexname": "idx_quickreplytemplate__scenekey_1_termid_1_isdelete_1_updatedon_1",

"ismultikey": false,

"multikeypaths": ,

"isunique": false,

"issparse": false,

"ispartial": false,

"indexversion": numberint("2"),

"direction": "forward",

"indexbounds": }},

"rejectedplans": [

,"inputstage": ,

"indexname": "idx_quickreplytemplate__scenekey_1_termid_1_isdelete_1",

"ismultikey": false,

"multikeypaths": ,

"isunique": false,

"issparse": false,

"ispartial": false,

"indexversion": numberint("2"),

"direction": "forward",

"indexbounds": }}

}}]},

"executionstats": ,

"indexname": "idx_quickreplytemplate__scenekey_1_termid_1_isdelete_1_updatedon_1",

"ismultikey": false,

"multikeypaths": ,

"isunique": false,

"issparse": false,

"ispartial": false,

"indexversion": numberint("2"),

"direction": "forward",

"indexbounds": ,

"key***amined": numberint("0"),

"seeks": numberint("1"),

"dupstested": numberint("0"),

"dupsdropped": numberint("0"),

"seeninvalidated": numberint("0")}}

},"serverinfo": ,

"ok": 1

}

開始分析:

可以看到,它選擇了後者,並且:檢出文件、然後有進行了索引掃瞄,基本上可以理解為最優了。

然後我們看看它排除了哪些索引?

第一步可以看出,進行了記憶體排序(sort);雖然,我們可以看出,他走了索引,但是索引命中的資料,又進行了記憶體排序。那麼產生記憶體排序的危害,我們就不細聊了。可以度娘;

MongoDB 關於索引的建議

我們收到了很多關於索引的問題。這一部分解答了其中的一小部分。有幾點要記住。第一,mongodb索引和mysql索引非常相似並且對於mysql的索引優化有很多也適用於mongodb。第二,更重要的是,這些索引的建議對你的應用提高也是有限的。對於應用的最佳索引策略應該基於很多的重要因素。包含了你期望查詢...

mongoDB 索引使用

一 索引基礎 mongodb的索引幾乎與傳統的關係型資料庫一模一樣,這其中也包括一些基本的優化技巧。下面是建立索引的命令 db.test.ensureindex 可以通過下面的名稱檢視索引是否已經成功建立 db.test.getindexes 刪除索引的命令是 db.test.dropindex 在...

MongoDB學習 索引

一 索引基礎 mongodb的索引幾乎與傳統的關係型資料庫一模一樣,這其中也包括一些基本的優化技巧。下面是建立索引的命令 db.test.ensureindex 可以通過下面的名稱檢視索引是否已經成功建立 db.test.getindexes 刪除索引的命令是 db.test.dropindex 在...