Mongodb中distinct效能問題

2021-09-25 22:31:51 字數 1098 閱讀 9164

最近用mongodb的distinct做了以下的乙個測試:

表名:usertable

表中document總數:2000w左右

欄位名:符合userid = "張三"條件的有100w條記錄,有索引

符合region="華南",且floor="3層"條件的記錄有90w條,且有復合索引

測試一:

db.usertable.distinct("region", )

輸出的結果為:[ "華北", "華中", "華南" ]。

本來結果沒什麼問題,主要問題在於耗時特別長,有1s左右,可以執行該次操作的時候,cpu消耗了30%左右。查了一下官網上關於distinct的介紹:

從介紹來看,distinct命令應該有用到了索引,為了確認,用explain()命令檢視,發現索引確實生效了:

那麼問題來了,既然distinct有用到了索引,在資料量為100w的情況下,為什麼耗時那麼多,cpu消耗如此大,看起來就像是在遍歷一樣呢?還是說,distinct只針對query查詢的索引有效,而對於需要去重的字段region的索引是不起作用的呢?

測試二:

db.usertable.distinct("floor", )

輸出的結果為:[ "1層", "3層", "4層" ]。

這次測試結果也如同上面一樣,耗時多,cpu消耗大,用explain()檢視,同樣發現,它用上了復合索引:

網上沒找到答案,在此記錄一下。

天巡收購移動APP開發公司Distinction

據悉,布達佩斯辦公室將成為天巡主要的移動應用開發中心,現有distinction團隊將繼續在布達佩斯辦公室工作。同時,天巡新增創意團隊也將加入,並促進天巡全球網點的移動端發展。distinction聯合創始人兼ceo b lint orosz表示 四年前我們創立distinction,我們的目標是鼓...

mongodb中的聚合

mongodb提供三種方式來實現聚合 聚合管道,map reduce,及單一目的的聚合方法。管道操作可以在分片的集合上運算,可以使用索引來提高效率,管道使用了mongodb內部的操作來進行高效資料聚合,是聚合操作的首選。tch sort操作出現在管道的開始位置時候可以使用索引。在3.2開始索引可以覆...

mongodb中的索引二

通常mongodb中的索引的建立方式如下 這種方式下,已經排好順序了,所以只要在排好序的key中找滿足查詢條件的記錄即可,需要掃瞄的資料量比較大,還有一種索引的建立方式 這種建立的方式中,不需要掃瞄很多的記錄,在索引中查詢滿足條件的記錄,但是需要在記憶體中排序,如果滿足記錄的條件很多,就要消耗很多的...