成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

關(guān)于mongodb中選擇性低的字段排序問題

Alliot / 2615人閱讀

摘要:一般我們都知道不給選擇性低的字段添加索引,因為這個不能提高效率。即選擇性高的字段選擇性低的字段方案一添加組合索引此圖索引為從圖上看出,還是索引沒有起作用,這是因為組合索引中,用右邊的字段索引,索引不起作用。

今天在開發(fā)公司評論系統(tǒng)的新需求時,碰到一個關(guān)于mongo sort排序的問題

條件:
1. 評論表comment中包含兩個字段 ctime(添加時間),like(點贊的人數(shù))
2. comment表中的數(shù)據(jù)為1000萬+
3. 無索引(沒有給ctime,like添加任何索引)
4. php查詢mongo的超時時間設置的是1s

查詢:

db.comment.find().skip(0).limit(*).sort({"ctime":-1})
//按照ctime排序
沒有報錯,查詢時間不到1s

db.comment.find().skip(0).limit(*).sort({"like":-1})
//按照like排序
報錯:超時,發(fā)現(xiàn)查詢時間為2s到3s


此圖為無索引

為什么會出現(xiàn)這個問題呢?當時很困惑,ctime與like的級別是一樣的,都沒有加索引且都是int型數(shù)據(jù),為什么一個查詢不到1s,一個要2s+?

突然一道金光射入我的腦子我一下就明白了!!
因為如果按ctime排序的話,這個數(shù)組就為有序數(shù)組,如果按like排序的話,這個數(shù)組就為無序數(shù)組。無序數(shù)組排序比有序排序的時間復雜度要大

note:一條記錄在添加時ctime是遞增的,而like是離散的數(shù)字
問題現(xiàn)在搞清楚了,現(xiàn)在怎么解決呢?

怎樣才能讓db.comment.find().skip(0).limit(*).sort({"like":-1})的查詢效率變高?

在不影響業(yè)務的情況下,我選擇了給like添加索引,但如何添加索引是個問題了。一般我們都知道不給選擇性低的字段添加索引,因為這個不能提高效率。那該如何做呢?

答案:就是添加組合索引

策略是創(chuàng)建組合索引包括這個低選擇性的字段。(即:選擇性高的字段+選擇性低的字段)

方案一

db.comment.ensureIndex({"ctime":1,"like":-1})
//添加組合索引
db.comment.find().skip(0).limit(*).sort({"like":-1})


此圖索引為{"ctime":1,"like":-1}
從圖上看出,還是索引沒有起作用,這是因為組合索引中,用右邊的字段索引,索引不起作用。

方案二

db.comment.ensureIndex({"like":-1,"ctime":1})
//添加組合索引
db.comment.find().skip(0).limit(*).sort({"like":-1})


此圖索引為{"like":-1,"ctime":1}
發(fā)現(xiàn)效率明顯提高了很多

了解組合索引的優(yōu)化原理請讀:10gen工程師談MongoDB組合索引的優(yōu)化

關(guān)于mysql數(shù)據(jù)庫索引 http://www.uml.org.cn/sjjm/201107145.asp

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/18739.html

相關(guān)文章

  • MongoDB指南---11、使用復合索引、$操作符如何使用索引、索引對象和數(shù)組、索引基數(shù)

    摘要:操作符如何使用索引有一些查詢完全無法使用索引,也有一些查詢能夠比其他查詢更高效地使用索引。有時能夠使用索引,但是通常它并不知道要如何使用索引。索引對象和數(shù)組允許深入文檔內(nèi)部,對嵌套字段和數(shù)組建立索引。 上一篇文章:MongoDB指南---10、索引、復合索引 簡介下一篇文章:MongoDB指南---12、使用explain()和hint()、何時不應該使用索引 1、使用復合索引 在多...

    saucxs 評論0 收藏0
  • MongoDB指南---11、使用復合索引、$操作符如何使用索引、索引對象和數(shù)組、索引基數(shù)

    摘要:操作符如何使用索引有一些查詢完全無法使用索引,也有一些查詢能夠比其他查詢更高效地使用索引。有時能夠使用索引,但是通常它并不知道要如何使用索引。索引對象和數(shù)組允許深入文檔內(nèi)部,對嵌套字段和數(shù)組建立索引。 上一篇文章:MongoDB指南---10、索引、復合索引 簡介下一篇文章:MongoDB指南---12、使用explain()和hint()、何時不應該使用索引 1、使用復合索引 在多...

    tomlingtm 評論0 收藏0
  • mysql - 收藏集 - 掘金

    摘要:步優(yōu)化以及其它數(shù)據(jù)庫后端掘金原文鏈接在發(fā)表了一篇簡潔有效有趣和令人信服的分鐘教程描述了如何進行優(yōu)化。關(guān)于的七種后端掘金對于的,在學習起來可能是比較亂的。 5 步優(yōu)化 MongoDB 以及其它數(shù)據(jù)庫 - 后端 - 掘金原文鏈接 Jared Rosoff 在 Scale Out Camp 發(fā)表了一篇簡潔、有效、有趣和令人信服的《8 分鐘 MongoDB 教程》描述了如何進行 MongoDB...

    Donald 評論0 收藏0
  • mongodb索引

    摘要:指定為創(chuàng)建唯一索引。默認值為索引的名稱。在建立唯一索引時是否刪除重復記錄指定創(chuàng)建唯一索引。索引權(quán)重值,數(shù)值在到之間,表示該索引相對于其他索引字段的得分權(quán)重。對于文本索引,該參數(shù)決定了停用詞及詞干和詞器的規(guī)則的列表。 索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄。 這種掃描全集合的查詢效率是非常低的,特別在...

    30e8336b8229 評論0 收藏0

發(fā)表評論

0條評論

Alliot

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<