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