mongodb学习(六)索引
準(zhǔn)備工作: 先插入100萬(wàn)條數(shù)據(jù)
for(i=0;i<=1000000;i++){db.users.insert({"i":i,"username":"user"+i,"age":Math.floor(Math.random()*120),"created":new Date()})}?1. 創(chuàng)建索引: 數(shù)據(jù)量越大創(chuàng)建索引時(shí)間越長(zhǎng)
db.users.ensureIndex({"username":1}) db.users.find({"username":"user234455"}).explain() ?查詢速度飛快...O(∩_∩)O~ 使用索引的代價(jià):? 添加一個(gè)索引,每次插入,更新,刪除操作都會(huì)耗費(fèi)更多時(shí)間;原因是數(shù)據(jù)變動(dòng)時(shí)mongodb每次都要更新文檔和索引. 在一個(gè)集合上通常不應(yīng)該擁有兩個(gè)以上的索引. 在常用的鍵上建立索引. 2. 復(fù)合索引:就是建立在多個(gè)鍵上的索引 (索引在排序時(shí)非常快,前提是首先使用索引鍵排序) db.users.ensureIndex({"username":1,"age":1})//每個(gè)索引都包含 age 和 name字段?? 三種使用方式:? (mongodb可以在任意方向上對(duì)索引進(jìn)行遍歷)
(1) 點(diǎn)查詢,這種最高效
db.users.find({"age":21}).sort({"username":-1})(2) 多點(diǎn)查詢: 使用索引查詢出來(lái)的結(jié)果是無(wú)序的,mongodb需要在內(nèi)存中重新排序,然后返回.問(wèn)題:結(jié)果集文檔數(shù)量比較大,查詢速度會(huì)慢;結(jié)果集超過(guò)32M,mongodb會(huì)出錯(cuò)
db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"username":1})(3) 使用另一個(gè)索引 {"username":1,"age":1} 可以使用hint強(qiáng)制使用某個(gè)索引
db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"name":1}).explain()db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"name":1}).hint({"name":1,"age":1}).explain()
索引本質(zhì)上是: 樹(shù),最小的值在最左邊,最大的值在最右邊.
(4) 只有在基于多鍵排序的時(shí)候,方向才變得重要.
(5) 覆蓋索引: 索引中已經(jīng)包含了要查找的字段;
(6) 復(fù)合索引: 對(duì)不同的查詢表現(xiàn)為不同的索引:, {"age":1,"username":1},可以"免費(fèi)" 獲取以age這個(gè)鍵開(kāi)頭的所有索引;
(7) $where和檢查一個(gè)鍵是否存在 無(wú)法使用索引; 在索引中不存在的字段和null字段的存儲(chǔ)方式是一樣的.
(8)查詢: 將精確匹配的字段放在前面,將范圍匹配的字段放在最后;
(9)$or: 可以對(duì)每個(gè)子句都使用索引,因?yàn)閷?shí)際上$or執(zhí)行兩次查詢?nèi)缓髮⒔Y(jié)果集合并,效率不高,盡可能使用 $in
??????????? $or需要每次檢查查詢的結(jié)果集并且將重復(fù)的文檔移除.
(10)索引嵌套文檔:
db.users.ensureIndex({"loc.city":1})(11)對(duì)數(shù)組簡(jiǎn)歷索引: 對(duì)數(shù)組建立索引實(shí)際上就是對(duì)數(shù)組中每一個(gè)元素建立索引條目,而不是對(duì)數(shù)組本身建立索引,一個(gè)索引中的數(shù)組字段最多只有一個(gè).
(12) 索引基數(shù): 就是集合中每個(gè)字段擁有不同值得數(shù)量.應(yīng)該再基數(shù)比較高的字段上建立索引.
(13)explain()? 可以提供大量與查詢有關(guān)的信息;如果scanAndOrder為true,那么說(shuō)明沒(méi)有使用索引,mongodb需要再內(nèi)存中排序,這回很慢
????? hint() 強(qiáng)行使用某個(gè)索引
db.users.find({"age":28}).hint({"age":1})3. 何時(shí)不應(yīng)該使用索引: 結(jié)果集在原集合中所占比重越大,索引速度就越慢. 一般來(lái)說(shuō): 查詢需要返回結(jié)果集30%的就需要比較 全表掃描和索引查找的速度...
??? 索引查找: 索引需要進(jìn)行兩次查找,一次是查找索引條目,一次是根據(jù)索引條目查找相應(yīng)文檔; 使用{"$natural":1} 強(qiáng)制全表掃描
4. 索引類型:
?? (1) 唯一索引: (會(huì)把null看做值)
? 復(fù)合唯一索引: 所有鍵的組合值必須是唯一的.
? 去除重復(fù)的索引:
db.users.ensureIndex({"usename":1},{"unique":true,"dropDups":true})(2) 稀疏索引: (如果一個(gè)肯能存在也可能不存在的字段,當(dāng)它存在時(shí),它必須是唯一的),稀疏索引可以使唯一的.
db.users.ensureIndex({"email":1},{"sparse":true})5. 索引管理: 數(shù)據(jù)庫(kù)所有的索引都存儲(chǔ)在system.indexes集合中; 索引順序很重要: {"age":1,"username":1},{"username":1,"age":1}是不同的索引
db.users.getIndexes() //uses所有的索引都可以在這里查看(1)索引標(biāo)識(shí):索引名稱是唯一的. 可以自定義索引
db.users.ensureIndex({"usename":1},{"name":"myIndex"})(2)刪除索引: mongodb創(chuàng)建索引時(shí)會(huì)阻塞所有對(duì)數(shù)據(jù)的讀寫請(qǐng)求.一直到創(chuàng)建完畢
db.users.drop("username_1")6. 固定集合...
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/ry123/p/3881375.html
總結(jié)
以上是生活随笔為你收集整理的mongodb学习(六)索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 文件夹选项不见了
- 下一篇: 利用 python 的各种开源工具自制浏