mongodb索引使用以及使用explain与profile调优
索引是用来加快查询速度的,事物都有双面性的,同时在每次插入、更新和删除操作时都会产生额外的开销。索引有时并不能解决查询慢的问题,一般来说,返回集合中一半以上的结果,全表扫描要比查询索引更高效些。 创建太多索引,会导致插入非常慢,同时还会占用
索引是用来加快查询速度的,事物都有双面性的,同时在每次插入、更新和删除操作时都会产生额外的开销。索引有时并不能解决查询慢的问题,一般来说,返回集合中一半以上的结果,全表扫描要比查询索引更高效些。 创建太多索引,会导致插入非常慢,同时还会占用很大空间。可以通过explain和hint工具来分析。 索引有方向的,倒序还是升序。 每个集合默认的最大索引个数为64个。
1. 查看索引
> db.jiunile_events.getIndexes(); [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "jiunile_login.jiunile_events", "name" : "_id_" }, { "v" : 1, "key" : { "stmp" : -1 }, "ns" : "jiunile_login.jiunile_events", "name" : "stmp_-1" }, { "v" : 1, "key" : { "uid" : 1, "stmp" : -1 }, "ns" : "jiunile_login.jiunile_events", "name" : "uid_1_stmp_-1" } ]
此实例中有三个索引,其中_id是创建表的时候自动创建的索引,不能删除。uid_1_stmp_-1是组合索引。1表示升序,-1表示降序。
2. 创建索引 索引参数有:
option values default backgroud true/false false dropDups true/false false unique true/false false sparse true/false false
常规索引创建
> db.jiunile_posts.ensureIndex({pid:1});
当有大量数据时,创建索引会非常耗时,可以指定到后台执行,只需指定“backgroud:true”即可。如
> db.jiunile_posts.ensureIndex({pid:1},{backgroud:true});
3. 嵌入式索引 为内嵌文档的键创建索引与普通的键创建索引并无差异。
> db.jiunile_posts.ensureIndex({"post.date":1})
4. 文档式索引
> db.jiunile_comments.insert({cid:222, properties:{user:'jiunile', email:'jiunile@jiunile.com'}}) > db.jiunile_comments.ensureIndex({properties:1})
5. 组合索引
> db.jiunile_comments.ensureIndex({"properties.user":1,"properties.email":1})
以下的查询将使用到此索引
> db.jiunile_comments.find({"properties.user":'jiunile',"properties.email":'jiunile@jiunile.com'}) > db.jiunile_comments.find({"properties.user":'jiunile'}) > db.jiunile_comments.find().sort({"properties.user":1})
对多个值进行组合索引,查询时,子查询与索引前缀匹配时,才可以使用该组合索引。
6. 唯一索引 只需要在ensureIndex命名中指定"unique:true"即可。
> db.jiunile_posts.ensureIndex({pid:1},{unique:true})
当为已有的集合创建索引,可能有些数据已经有重复了的,那么创建唯一索引将失败。可以使用dropDups来保留第一个文档,而后的重复文档将删除,这种方法慎重操作。
> db.jiunile_posts.ensureIndex({pid:1},{unique:true, dropDups:true})
7. 强制索引 hint命令可以强制使用某个索引
> db.jiunile_posts.find({pid:{$lt:333}}).hint({pid:1,date:1})
8. 删除索引 删除集合所有索引:
> db.collection.dropIndexes()
删除集合某个索引:
> db.collection.dropIndex({x:1})
9. 重建索引
> db.collection.reIndex() > db.runCommand({reIndex:'collection'})
重建索引会锁住集合的。用repair命令修复数据库时,会重建索引的。
10. 全文索引 mongodb全文索引是在2.4版本引入的,后面再说这个。
11. explain执行计划 使用explain命令返回查询使用的索引情况,耗时,扫描文档数等等统计信息。
> db.jiunile_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" : "jiunile-191155:27017" }
字段说明:
cursor:返回游标类型 isMultiKey:是否使用组合索引 n:返回文档数量 nscannedObjects:被扫描的文档数量 nscanned:被检查的文档或索引条目数量 scanAndOrder:是否在内存中排序 indexOnly: nYields:该查询为了等待写操作执行等待的读锁的次数 nChunkSkips: millis:耗时(毫秒) indexBounds:所使用的索引 server: 服务器主机名
12. 开启profiling功能 查看profiling级别:
> 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 – 记录所有命令
13. 查询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" : "jiunile_event.jiunile_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" : "jiunile_event.jiunile_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: 该命令执行耗时,以毫秒记
14. 修改profiling大小 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.setProfilingLevel(0) { "was" : 2, "slowms" : 10, "ok" : 1 } > > db.getProfilingLevel() 0 > db.system.profile.drop() true > db.createCollection("system.profile",{capped:true, size: 1000000}) { "ok" : 1 } > db.system.profile.stats() { "ns" : "jiunile_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 }
来源:http://www.ttlsa.com/html/1661.html



熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

BitgetLaunchpool是一個為所有加密貨幣愛好者而設計的動態平台。 BitgetLaunchpool以其獨特的產品脫穎而出。在這裡,您可以質押您的代幣來解鎖更多獎勵,包括空投、高額回報,以及專屬早期參與者的豐厚獎金池。什麼是BitgetLaunchpool? BitgetLaunchpool是一個加密貨幣平台,可以透過使用者友善的條款和條件來質押和賺取代幣。透過在Launchpool中投入BGB或其他代幣,用戶有機會獲得免費空投、收益和參與豐厚的獎金池。質押資產的收益在T+1小時內計算,獎勵按

.NET 4.0 用於創建各種應用程序,它為應用程式開發人員提供了豐富的功能,包括:物件導向程式設計、靈活性、強大的架構、雲端運算整合、效能最佳化、廣泛的程式庫、安全性、可擴展性、資料存取和行動開發支援。

本文介紹如何在Debian系統上配置MongoDB實現自動擴容,主要步驟包括MongoDB副本集的設置和磁盤空間監控。一、MongoDB安裝首先,確保已在Debian系統上安裝MongoDB。使用以下命令安裝:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集確保高可用性和數據冗餘,是實現自動擴容的基礎。啟動MongoDB服務:sudosystemctlstartmongodsudosys

本文介紹如何在Debian系統上構建高可用性的MongoDB數據庫。我們將探討多種方法,確保數據安全和服務持續運行。關鍵策略:副本集(ReplicaSet):利用副本集實現數據冗餘和自動故障轉移。當主節點出現故障時,副本集會自動選舉新的主節點,保證服務的持續可用性。數據備份與恢復:定期使用mongodump命令進行數據庫備份,並製定有效的恢復策略,以應對數據丟失風險。監控與報警:部署監控工具(如Prometheus、Grafana)實時監控MongoDB的運行狀態,並

在開發一個電商網站時,我遇到了一個棘手的問題:如何為用戶提供個性化的商品推薦。最初,我嘗試了一些簡單的推薦算法,但效果並不理想,用戶的滿意度也因此受到影響。為了提升推薦系統的精度和效率,我決定採用更專業的解決方案。最終,我通過Composer安裝了andres-montanez/recommendations-bundle,這不僅解決了我的問題,還大大提升了推薦系統的性能。可以通過一下地址學習composer:學習地址

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

CentOS系統下MongoDB高效備份策略詳解本文將詳細介紹在CentOS系統上實施MongoDB備份的多種策略,以確保數據安全和業務連續性。我們將涵蓋手動備份、定時備份、自動化腳本備份以及Docker容器環境下的備份方法,並提供備份文件管理的最佳實踐。手動備份:利用mongodump命令進行手動全量備份,例如:mongodump-hlocalhost:27017-u用戶名-p密碼-d數據庫名稱-o/備份目錄此命令會將指定數據庫的數據及元數據導出到指定的備份目錄。

PiNetwork即將推出革命性移動銀行平台PiBank! PiNetwork今日發布重大更新Elmahrosa(Face)PIMISRBank,簡稱PiBank,它將傳統銀行服務與PiNetwork加密貨幣功能完美融合,實現法幣與加密貨幣的原子交換(支持美元、歐元、印尼盾等法幣與PiCoin、USDT、USDC等加密貨幣的互換)。究竟PiBank有何魅力?讓我們一探究竟! PiBank主要功能:一站式管理銀行賬戶和加密貨幣資產。支持實時交易,並採用生物特
