Mongodb進階
Mongodb的增刪查改操作是很簡單的。有必要再學點高深的東西,這篇文章就是做這個的。
1、index
建立索引的基本操作:
>>> from pymongo import ASCENDING, DESCENDING
>>> posts.create_index([("date", DESCENDING), ("author", ASCENDING)])
u'date_-1_author_1'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
u'BtreeCursor date_-1_author_1'
>>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
2
索引會通過建立B樹的方式提高資料的查詢速度。
學會使用索引對於提高服務效能來說很有意義。
索引是用來加快查詢速度的,事物都有雙面性的,同時在每次插入、更新和刪除操作時都會產生額外的開銷。索引有時並不能解決查詢慢的問題,一般來說,返回集合中一半以上的結果,全表掃描要比查詢索引更高效些。
建立太多索引,會導致插入非常慢,同時還會佔用很大空間。可以通過explain和hint工具來分析。索引有方向的,倒序還是升序。每個集合預設的最大索引個數為64個。
檢視索引的命令:
db.ttlsa_events.getIndexes();
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "ttlsa_login.ttlsa_events",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"stmp" : -1
},
"ns" : "ttlsa_login.ttlsa_events",
"name" : "stmp_-1"
},
{
"v" : 1,
"key" : {
"uid" : 1,
"stmp" : -1
},
"ns" : "ttlsa_login.ttlsa_events",
"name" : "uid_1_stmp_-1"
}
]
此例項中有三個索引,其中id是建立表的時候自動建立的索引,不能刪除。uid_1_stmp-1是組合索引。1表示升序,-1表示降序。
建立索引:
當有大量資料時,建立索引會非常耗時,可以指定到後臺執行,只需指定“backgroud:true”即可。如:
db.ttlsa_posts.ensureIndex({pid:1},{backgroud:true});
組合索引:
db.ttlsa_comments.ensureIndex({"properties.user":1,"properties.email":1})
> db.ttlsa_comments.find({"properties.user":'ttlsa',"properties.email":'ttlsa@ttlsa.com'})
> db.ttlsa_comments.find({"properties.user":'ttlsa'})
> db.ttlsa_comments.find().sort({"properties.user":1})
對多個值進行組合索引,查詢時,子查詢與索引字首匹配時,才可以使用該組合索引。
建立唯一索引:
db.ttlsa_posts.ensureIndex({pid:1},{unique:true})
> db.ttlsa_posts.ensureIndex({pid:1},{unique:true, dropDups:true})
當為已有的集合建立索引,可能有些資料已經有重複了的,那麼建立唯一索引將失敗。可以使用dropDups來保留第一個文件,而後的重複文件將刪除,這種方法慎重操作。
刪除索引:
> db.collection.dropIndexes()
刪除某個索引:
> db.collection.dropIndex({x:1})
2、explain執行計劃
使用explain命令返回查詢使用的索引情況,耗時,掃描文件數等等統計資訊。
> db.ttlsa_events.find({uid:178620830}).explain()
{
"cursor" : "BtreeCursor uid_1_stmp_-1",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"nscannedObjectsAllPlans" : 2,
"nscannedAllPlans" : 2,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 4,
"indexBounds" : {
"uid" : [
[
178620830,
178620830
]
],
"stmp" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "TTLSA-191155:27017"
}
欄位說明:
- cursor:返回遊標型別
- isMultiKey:是否使用組合索引
- n:返回文件數量
- nscannedObjects:被掃描的文件數量
- nscanned:被檢查的文件或索引條目數量
- scanAndOrder:是否在記憶體中排序
- indexOnly:
- nYields:該查詢為了等待寫操作執行等待的讀鎖的次數
- nChunkSkips:
- millis:耗時(毫秒)
- indexBounds:所使用的索引
- server: 伺服器主機.
3、profiling
檢視profile級別:
> db.getProfilingLevel()
0
設定profiling級別:
> db.setProfilingLevel( level , slowms )
> db.setProfilingLevel(2,10)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
profile的級別可以取0,1,2 表示的意義如下:
- 0 – 不開啟 預設級別
- 1 – 記錄慢命令 (預設為>100ms)
- 2 – 記錄所有命令
查詢profiling記錄:
MongoDB Profile 記錄是直接存在系統 db 裡的,記錄位置system.profile 。
> db.system.profile.find().sort({$natural:-1}).limit(1)
{ "ts" : ISODate("2013-07-18T09:56:59.546Z"), "op" : "query", "ns" : "ttlsa_event.ttlsa_events", "query" : { "$query" : { "uid" : 161484152, "stmp" : { "$gt" : 0 } }, "$orderby" : { "stmp" : -1 } }, "ntoreturn" : 0, "ntoskip" : 0, "nscanned" : 35, "keyUpdates" : 0, "numYield" : 0, "lockStats" : { "timeLockedMicros" : { "r" : NumberLong(354), "w" : NumberLong(0) }, "timeAcquiringMicros" : { "r" : NumberLong(3), "w" : NumberLong(3) } }, "nreturned" : 35, "responseLength" : 7227, "millis" : 0, "client" : "10.1.242.209", "user" : "" }
> db.system.profile.find().pretty().limit(1)
{
"ts" : ISODate("2013-07-18T09:53:40.103Z"),
"op" : "query",
"ns" : "ttlsa_event.ttlsa_event_friends",
"query" : {
"_id" : 195794232
},
"ntoreturn" : 1,
"idhack" : true,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(45),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(3),
"w" : NumberLong(5)
}
},
"responseLength" : 20,
"millis" : 0,
"client" : "10.1.22.199",
"user" : ""
}
欄位說明:
ts: 該命令在何時執行
op: 操作型別
query: 本命令的詳細資訊
responseLength: 返回結果集的大小
ntoreturn: 本次查詢實際返回的結果集
millis: 該命令執行耗時,以毫秒記
> db.setProfilingLevel(0)
{ "was" : 2, "slowms" : 10, "ok" : 1 }
>
> db.getProfilingLevel()
0
> db.system.profile.drop()
true
4、capped Collections
capped Collections 比普通Collections 的讀寫效率高。Capped Collections 是高效率的Collection型別,它有如下特點:
a. 固定大小;Capped Collections 必須事先建立,並設定大小:> db.createCollection("collection", {capped:true, size:100000})
b. Capped Collections 可以insert 和update 操作,不能delete 操作。只能用drop()方法刪除整個Collection。
c. 預設基於Insert 的次序排序的。如果查詢時沒有排序,則總是按照insert 的順序返回。
d. FIFO。如果超過了Collection 的限定大小,則用FIFO 演算法,新記錄將替代最先insert的記錄
> db.createCollection("system.profile",{capped:true, size: 1000000})
{ "ok" : 1 }
> db.system.profile.stats()
{
"ns" : "ttlsa_event.system.profile",
"count" : 0,
"size" : 0,
"storageSize" : 1003520,
"numExtents" : 1,
"nindexes" : 0,
"lastExtentSize" : 1003520,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 0,
"indexSizes" : {
},
"capped" : true,
"max" : 2147483647,
"ok" : 1
}
相關文章
- MongoDB aggregate做統計資料(group進階)。MongoDB
- Mongodb高階特性MongoDB
- Mongodb高階更新MongoDB
- Mongodb高階查詢MongoDB
- ❖ MongoDB 高階查詢MongoDB
- MongoDB ( 五 )高階_索引MongoDB索引
- MongoDB高階查詢詳細MongoDB
- CSS高階進階CSS
- MongoDB 3.0 正式版即將釋出 將進入全新發展階段MongoDB
- 高階前端進階(五)前端
- 高階前端進階(七)前端
- 高階前端進階(三)前端
- React 進階之高階元件React元件
- MongoDB ( 四 )高階_find修飾符MongoDB
- mongodb 階段性技術總結MongoDB
- Redux 進階Redux
- ElasticSearch 進階Elasticsearch
- HBase進階
- SQL進階SQL
- JavaScript進階JavaScript
- css進階CSS
- Masonry進階
- vue進階Vue
- protobuf進階
- 06進階
- 【MongoDB學習筆記】-使用 MongoDB 進行 CRUD 操作(上)MongoDB筆記
- 【MongoDB學習筆記】-使用 MongoDB 進行 CRUD 操作(下)MongoDB筆記
- MongoDB進階之路:不僅僅是技術研究,還有優化和最佳實踐MongoDB優化
- Typescript 高階語法進階TypeScript
- React 進階(三) 高階元件React元件
- 高階前端進階系列 - webview前端WebView
- Java小白進階筆記(5)-進階物件導向Java筆記物件
- SQLMAP進階使用SQL
- 進階筆記筆記
- sqlmap 進階 (一)SQL
- RocketMQ進階技巧MQ
- Sanic 路由進階路由
- React 進階一React