摘要:索引使用場景優加快查詢速度劣增刪改會產生額外的開銷占用空間返回集合中一半以上的數據,全表掃描的效率高索引基礎基礎操作查看索引創建索引已有大量數據時可后臺執行不阻塞刪除索引查看索引大小屬性索引順序為正序,為逆序在復合索引中需注意順序索引屬
索引使用場景
優:加快查詢速度
劣:增刪改會產生額外的開銷、占用空間
tips: 返回集合中一半以上的數據,全表掃描的效率高
索引基礎 基礎操作查看索引:db.test.getIndexes()
創建索引:db.test.ensureIndex({"username":1},{"background":true,"name":"index_test_name"}) //已有大量數據時可后臺執行不阻塞
刪除索引: db.test.dropIndex({"username":1})
查看索引大小: db.test.totalIndexSize()
屬性索引順序:
1為正序,-1為逆序
在復合索引中需注意順序(id:1, age:-1)
索引屬性:
唯一性
db.test.ensureIndex({x:1,y:1},{unique:true})
稀疏性
db.test.ensureIndexx({},{sparse:true/false}) 不稀疏(默認): 1. 可插入不存在索引字段的數據,null; 2. 可篩選不存在字段: db.test.find({m:{$exist:ture}}) 稀疏:優化分析方法
explain
獲知系統如何處理請求
cursor 返回游標類型(BasicCursor或BtreeCursor) nscanned 被掃描的文檔數量 n 返回的文檔數 millis 耗時(毫秒) indexBounds 所使用的索引
hint
強制使用某個索引
db.test.find({"age":20}).hint({"name":1,"age":1}) // .hint(name_1_age_1)
profile
設置日志級別,記錄慢查詢
Tips查詢條件順序自動調整
能為前綴式的正則表達式命中索引(/^z/)
對需要大量sort的鍵建立索引,避免全部數據加載到內存
$ne、$nin 不會使用索引
索引種類_id索引
默認生成唯一字段
單鍵索引
值為一個單一的值
db.test.ensureIndex({x:1})
多鍵索引
值具有多個記錄,如數組、內嵌文檔
db.test.insert({x:[1,2,3,4]})
每一個索引字段最多包含一個數組
Y: {_id:1, a:[1,2], b:1, category:"A array"} 與 {_id:2, a:1, b:[1,2], category:"B array"} N: {_id:3, a:[1,2], b:[1,2], category:"AB both array"}
查詢
//數組查詢 數組中包含: db.fruitshop.find({"fruits":"apple"}) 包含多個: db.fruitshop.find({"fruits":{"$all":["apple", "banana"]}}) 精確匹配: db.fruitshop.find({"fruits":["apple","orange","pear"]}) //順序與數量一致 特定位置元素查詢: db.fruitshop.find({"fruits.1":"orange"}) 查詢數組長度: db.fruitshop.find({"fruits":{"$size":3}}) //size不能和其他操作符連用,如"$gt"等 返回固定長度: db.fruitshop.find({"fruits":{"$slice":2}}) //前2個 db.fruitshop.find({"fruits":{"$slice":-1}}) //后1個 db.fruitshop.find({"fruits":{"$slice":[3,6]}}) //第4~7個,無數據則返回[] //內嵌文檔 完全匹配: db.staff.find({"name":{"first":"joe","middle":"bush"}}) //順序與數量一致 鍵值對查詢: db.staff.find({"name.first":"joe","name.middle":"bush"}) //點表示法,在插入時鍵名不能包含點(約束) 多層內嵌: elemMatch db.blogs.find({"comment":{"$elemMatch":{"author":"joe", "score":{"$gte":3}}}}) //內嵌文檔中匹配author和score條件 where db.fruitshop.find({"$where":function(){}}) //性能低,每個文檔轉換成一個javascript對象放入函數執行
復合索引
多個條件,從左到右執行
{a:1,b:1,c:1} => {a:1},{a:1,b:1},{a:1,b:1,c:1} db.test.ensureIndex({x:1,y:1})
過期索引
一段時間后過期,刪除相應數據(用戶的登錄信息、存儲的日志)
db.test.ensureIndex({time:1},{expireAfterSeconds:30})
限制
字段類型必須是ISODate或者ISODate數組(數組中最小的時間)
不能是復合索引(不能指定兩個過期時間)
刪除時間不精確(后臺進程60s跑一次)
全文索引
字符串或者字符串數組可搜索
//建立索引 db.test.ensureIndex({title:"text"}) db.test.ensureIndex({key1:"text",key2:"text"}) //對多個字段創建全文索引 db.test.ensureIndex({$**:"text"}) //對所有字段建全文索引 //查找 不需要指定字段名稱: db.test.find({"$text":{"$search":"coffee"}}) //每個數據集合只允許創建一個全文索引(可針對一個、多個、全部字段) 查找多個關鍵詞(空格代表 或 操作): db.test.find({"$text":{"$search":"aa bb cc"}}) 指定不包含詞(-代表 非 操作): db.test.find({"$text":{"$search":"aa bb -cc"}}) 與關系操作: db.test.find({"$text":{"$search":""aa" "bb" "cc""}}) 相似度查詢: db.test.find({"$text":{"$search":"aa bb"}},{"score:{"$meta":"textScore"}"}) //score字段得分越高,相關度越高 db.test.find({"$text":{"$search":"aa bb"}},{"score":{"$meta":"textScore"}}).sort({"score":{"$meta":"textScore"}}) //score相關度排序 //限制 每次查詢只能指定一個$text 有了$text則hint(強制指定索引)不起作用 中文支持不好(企業版可支持)
地理位置索引
將點的位置存儲,可以按位置查找其他點
2D索引
用于存儲和查找平面上的點
db.test.ensureIndex({w:"2d"}) //使用經緯度表示 取值范圍 經度[-180,180] 緯度[-90,90] db.test.insert({w:[180,90]}) //查詢 使用$near查詢距離某個點最近的點(默認返回100個) db.test.find({"$near":[x,y]}) db.test.find({w:{"$near":[x,y],"$maxDistance":"z"}}) //限制返回的最遠距離 使用$geoWithin查詢某個形狀內的點 矩形($box:[[x1,y1],[x2,y2]]) db.test.find({w:{"$geoWithin:{"$box":[[0,0],[3,3]]}}"}}) 圓形($center:[[x,y],r]) db.test.find({w:{"$geoWithin":{"$center":[0,0],5}}}) 多邊形($polygon:[[x1,y1],[x2,y2],..) db.test.find({w:{"$geoWithin":{"$polygon":[[0,0],[0,1],[2,5],[6,1]]}}}) 使用$geoNear查詢,返回最大距離和平均距離等數據
相關擴展:
《地理位置索引的實現原理》
2Dsphere索引
用于存儲和查找球面上的點
db.test.ensureIndex({key:"2dsphere"})
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19317.html
摘要:索引使用場景優加快查詢速度劣增刪改會產生額外的開銷占用空間返回集合中一半以上的數據,全表掃描的效率高索引基礎基礎操作查看索引創建索引已有大量數據時可后臺執行不阻塞刪除索引查看索引大小屬性索引順序為正序,為逆序在復合索引中需注意順序索引屬 索引使用場景 優:加快查詢速度 劣:增刪改會產生額外的開銷、占用空間 tips: 返回集合中一半以上的數據,全表掃描的效率高 索引基礎 基礎操作 查看...
摘要:我們常說的分表分庫分區等概念都屬于分片的實際體現。傳統分片做法是手工分表分庫。自動分片技術是根據指定的片鍵自動拆分數據并維護數據請求路由的過程。 1.mongodb特性 1)mongo是一個面向文檔的數據庫,它集合了nosql和sql數據庫兩方面的特性。 2)所有實體都是在首次使用時創建。 3)沒有嚴格的事務特性,但是它保證任何一次數據變更都是原子性的。 4)也沒有固定的數據模型 5)...
摘要:集合名命名規范集合名不能是空字符串。集合名不能含有字符空字符,這個字符表示集合名的結尾。集合名不能以開頭,這是為系統集合保留的前綴。有些驅動程序的確支持在集合名里面包含,這是因為某些系統生成的集合中包含該字符。 原始文章鏈接 - 我的博客:http://www.lovebxm.com/2017/0... MongoDB - 簡介 官網:https://www.mongodb.com/ ...
閱讀 1436·2021-09-02 19:23
閱讀 1586·2021-08-11 11:19
閱讀 641·2019-08-30 15:55
閱讀 1653·2019-08-30 12:50
閱讀 2241·2019-08-30 11:23
閱讀 2180·2019-08-29 13:13
閱讀 1500·2019-08-28 18:13
閱讀 3344·2019-08-26 11:53