摘要:一般我們都知道不給選擇性低的字段添加索引,因為這個不能提高效率。即選擇性高的字段選擇性低的字段方案一添加組合索引此圖索引為從圖上看出,還是索引沒有起作用,這是因為組合索引中,用右邊的字段索引,索引不起作用。
今天在開發公司評論系統的新需求時,碰到一個關于mongo sort排序的問題
條件:
1. 評論表comment中包含兩個字段 ctime(添加時間),like(點贊的人數)
2. comment表中的數據為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排序 報錯:超時,發現查詢時間為2s到3s
此圖為無索引
為什么會出現這個問題呢?當時很困惑,ctime與like的級別是一樣的,都沒有加索引且都是int型數據,為什么一個查詢不到1s,一個要2s+?
突然一道金光射入我的腦子我一下就明白了!!
因為如果按ctime排序的話,這個數組就為有序數組,如果按like排序的話,這個數組就為無序數組。無序數組排序比有序排序的時間復雜度要大。
note:一條記錄在添加時ctime是遞增的,而like是離散的數字問題現在搞清楚了,現在怎么解決呢?
怎樣才能讓db.comment.find().skip(0).limit(*).sort({"like":-1})的查詢效率變高?
在不影響業務的情況下,我選擇了給like添加索引,但如何添加索引是個問題了。一般我們都知道不給選擇性低的字段添加索引,因為這個不能提高效率。那該如何做呢?
答案:就是添加組合索引策略是創建組合索引包括這個低選擇性的字段。(即:選擇性高的字段+選擇性低的字段)
方案一
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}
發現效率明顯提高了很多
了解組合索引的優化原理請讀:10gen工程師談MongoDB組合索引的優化
關于mysql數據庫索引 http://www.uml.org.cn/sjjm/201107145.asp
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18739.html
摘要:操作符如何使用索引有一些查詢完全無法使用索引,也有一些查詢能夠比其他查詢更高效地使用索引。有時能夠使用索引,但是通常它并不知道要如何使用索引。索引對象和數組允許深入文檔內部,對嵌套字段和數組建立索引。 上一篇文章:MongoDB指南---10、索引、復合索引 簡介下一篇文章:MongoDB指南---12、使用explain()和hint()、何時不應該使用索引 1、使用復合索引 在多...
摘要:操作符如何使用索引有一些查詢完全無法使用索引,也有一些查詢能夠比其他查詢更高效地使用索引。有時能夠使用索引,但是通常它并不知道要如何使用索引。索引對象和數組允許深入文檔內部,對嵌套字段和數組建立索引。 上一篇文章:MongoDB指南---10、索引、復合索引 簡介下一篇文章:MongoDB指南---12、使用explain()和hint()、何時不應該使用索引 1、使用復合索引 在多...
摘要:步優化以及其它數據庫后端掘金原文鏈接在發表了一篇簡潔有效有趣和令人信服的分鐘教程描述了如何進行優化。關于的七種后端掘金對于的,在學習起來可能是比較亂的。 5 步優化 MongoDB 以及其它數據庫 - 后端 - 掘金原文鏈接 Jared Rosoff 在 Scale Out Camp 發表了一篇簡潔、有效、有趣和令人信服的《8 分鐘 MongoDB 教程》描述了如何進行 MongoDB...
摘要:指定為創建唯一索引。默認值為索引的名稱。在建立唯一索引時是否刪除重復記錄指定創建唯一索引。索引權重值,數值在到之間,表示該索引相對于其他索引字段的得分權重。對于文本索引,該參數決定了停用詞及詞干和詞器的規則的列表。 索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄。 這種掃描全集合的查詢效率是非常低的,特別在...
閱讀 3418·2021-09-22 16:00
閱讀 3456·2021-09-07 10:26
閱讀 3010·2019-08-30 15:55
閱讀 2864·2019-08-30 13:48
閱讀 1372·2019-08-30 12:58
閱讀 2173·2019-08-30 11:15
閱讀 951·2019-08-30 11:08
閱讀 529·2019-08-29 18:41