有用的 Mongo命令行 db.currentOp() db.collection.find().explain() - 摘自网络
|
在Heyzap 和 Bugsnag 我已经使用MongoDB超过一年了,我发现它是一个非常强大的数据库。和其他的数据库一样,它有一些缺陷,但是这里有一些东西我希望有人可以早一点告诉我的。 即使建立索引选择性计数还是很缓慢举个例子,当对用户feed进行分页时,你可能会看到类似的东西, db.collection.count({username: "my_username"});
在MongoDB,这种计数采取的数量级的时间比你希望的要长。有一个open ticke,目前为2.4,在这里,我希望希望他们可以将它弄出来。在那之前,你可以留下自己的数据汇总。在插入一个新的文档的时候,你可以在mongo中用$inccommand存储数据汇总。 |
副本集读取不一致
当你开始利用副本集跨集群分发读数结果,就会使自己卷入麻烦的漩涡。例如,如果你将数据写到主设备,随后的读操作可能会被指引到从设备,而从设备尚有待拷贝数据。可以用类似下面的例子来说明这一点,
// Writes the object to the primary
db.collection.insert({_id: ObjectId("505bd76785ebb509fc183733"), key: "value"}); // This find is routed to a read-only secondary, and finds no results
db.collection.find({_id: ObjectId("505bd76785ebb509fc183733")});
如果还有性能问题的话这个问题会更复杂,因为这会导致主设备与从设备之间的复制滞后,使其增长到数分钟乃至某些情况下的数小时。
你既可以控制一次查询是否运行于从设备,也可以控制在插入操作中有多少从设备执行复制操作,但是这将影响到性能,在某些情况甚至会引起永久阻塞!
范围查询被以不同顺序索引
我发现范围查询使用的索引与其他的查询有些许不同。一般在一次复合查询中,你会用关键字作为索引操作的后一个参数。然而,在使用诸如$in之类的范围查询时,Mongo在应用该范围前就应用了索引。这会导致对文档的索引是在内存中完成,而这相当的慢!
// This doesn't use the last element in a compound index to sort
db.collection.find({_id: {$in : [
ObjectId("505bd76785ebb509fc183733"),
ObjectId("505bd76785ebb509fc183734"),
ObjectId("505bd76785ebb509fc183735"),
ObjectId("505bd76785ebb509fc183736")
]}}).sort({last_name: 1});
在Heyzap,我们通过为这个查询在Redis中创建一个缓存层,从而绕过了这个问题。但如果在$in声明中你只有两个数值,你也可以执行同样的查询两次,或者如果你有可用的RAM,你也可以调整这个索引。
Mongo的 BSON ID 很好用
Mongo的 BSON ID给你提供了大量有用的功能,但当我我第一次使用Mongo时,我都没有了解到可以用它所做事情的二分之一。例如,BSON ID的创建时间是被存储于ID的。你可以提取出这个时间,轻松的拥有一个created_at字段!
// Will return the time the ObjectId was created
ObjectId("505bd76785ebb509fc183733").getTimestamp();
BSON ID会随时间递增,因此按id排序也就是按创建日期排序。这一列是自动索引的,所以查询起来会相当快。你可以在10gen网站 读到更多关于其内容。
索引所有的查询
当我第一次使用Mongo时,我有时候会在特定的基础环境上或从一个定时任务中执行查询。最初那些查询并没有被索引,因为不需要面对用户也不需要经常运行。然而这给别的索引查询带来了性能问题,因为未索引的查询会做大量的磁盘读操作,这影响到对未缓存文档的检索。于是我下决心要保证那些查询至少是部分索引的,以免这样的事情再次发生。
始终对新建的查询执行explain操作
显然,如果你有关系数据库的使用背景,你一定熟悉 explain操作,这在Mongo里面同样重要。当你为一个应用新增一个查询时,你应该在生产数据上运行一下查询以检查其速度。你也可以要求Mongo执行explain 来解释查询到底怎么执行的,以便于你可以检查索引之类的参数等等。
db.collection.find(query).explain()
{
// BasicCursor means no index used, BtreeCursor would mean this is an indexed query
"cursor" : "BasicCursor", // The bounds of the index that were used, see how much of the index is being scanned
"indexBounds" : [ ], // Number of documents or indexes scanned
"nscanned" : 57594, // Number of documents scanned
"nscannedObjects" : 57594, // The number of times the read/write lock was yielded
"nYields" : 2 , // Number of documents matched
"n" : 3 , // Duration in milliseconds
"millis" : 108, // True if the results can be returned using only the index
"indexOnly" : false, // If true, a multikey index was used
"isMultiKey" : false
}
我曾见过新部署的应用程序就因为其中的查询语句没有在生产环境中做验证而导致的整个站点down掉。做个验证是相对快速和容易做到的,所以不要找拒绝!
分析器
MongoDB自带一个非常有用的分析器。你可以根据你的需要,设定分析器只分析超过一定时间的查询。我设定是记录所有超过100微秒的查询。
// 分析所有超过100微秒的查询
db.setProfilingLevel(1, 100); // 分析所有的查询
db.setProfilingLevel(2); // 关闭分析器
db.setProfilingLevel(0);
分析器保存所有的分析数据到加了前缀的system.profile集。这和其他的数据集很像,你可以对他执行查询,例如:
// 知道最近的分析
db.system.profile.find().sort({$natural:-1}); //找到超过5毫秒的查询
db.system.profile.find( { millis : { $gt : 5 } } ); // 找到最慢的查询
db.system.profile.find().sort({millis:-1});
你可以可以通过show profile helper显示最近分析输出。
分析器本身会给每一个查询增加一些开销,但是我认为这是值得的。没有他,你会是摸眼瞎。我宁可牺牲一点点的速度开销,来让我能看到是那些查询导致问题的。没有它你根本意识不到你的查询对用户来说到底有多慢。
有用的 Mongo命令行
这儿是一些有用的命令行,你可以在mongo shell中运行它们,在监视你服务器状态。这些都可以脚本化,所以你可以用它获得数据,用来监控或者绘制图表。
- db.currentOp() - 显示你所有当前正在运行操作
- db.killOp(opid) - 可以用来杀掉长查询
- db.serverStatus() - 显示你整个服务器的状态,对监控非常有用
- db.stats() - 显示你选中库的状态
- db.collection.stats() - 特定集的状态
db.collection.find().explain()
监控
经过过去一年对Mongo生产实例的监控,我列出了系列需要监控的关键阈值。
索引大小
根据你你的工作需要调整MongoD内存中合适的大小,这是必须的。以Heyzap为例,我们需要把所有的索引都放到内存里,当浏览老游戏或者用户配置时候,我们要很频繁地查询整个数据集。
通过图表化的索引大小,让Heyzap能准确的预知何时需要增加服务器,何时删除索引或者其他的方法处理来增加索引的大小。我们能够在大约一天内预知是否需要处理当前索引增长的问题。
监控
经过过去一年对Mongo生产实例的监控,我列出了系列需要监控的关键阈值。
索引大小
根据你你的工作需要调整MongoD内存中合适的大小,这是必须的。以Heyzap为例,我们需要把所有的索引都放到内存里,当浏览老游戏或者用户配置时候,我们要很频繁地查询整个数据集。
通过图表化的索引大小,让Heyzap能准确的预知何时需要增加服务器,何时删除索引或者其他的方法处理来增加索引的大小。我们能够在大约一天内预知是否需要处理当前索引增长的问题。
有用的 Mongo命令行 db.currentOp() db.collection.find().explain() - 摘自网络的更多相关文章
- Mongo命令行中执行CRUD
在命令行中使用mongo自带的shell命令来执行CRUD操作 首先链接到数据库 增 db.qiao.insert({"qq":1}) db.qiao.save({"qq ...
- [MongoDB]mongo命令行工具
1.use dbname 自动创建 2.db.user.find() 空 show collections 空 show dbs 3.db.user.save({name:'',age:20}) db ...
- 【转载】10个有用的du命令行
10 Useful du (Disk Usage) Commands to Find Disk Usage of Files and Directories The Linux “du” (Disk ...
- 20个有用的linux命令行技巧
20 Unix Command Line Tricks – Part I http://www.cyberciti.biz/open-source/command-line-hacks/20-unix ...
- mongo命令行操作
- MongoDB分析工具之三:db.currentOp()
db.currentOp() db.currentOp是个好东西,顾名思义,就是当前的操作.在mongodb中可以查看当前数据库上此刻的操作语句信息,包括insert/query/update/rem ...
- MongoDB GridFS(命令行+php操作)
一.GridFS是什么 & 为什么需要它 我们知道目前MongoDB的BSON文件最大只能是16M,也就是说单个文档最多只能存储16M的数据,那么如果需要MongoDB存储超过16M的大文件该 ...
- linux命令行命令
Linux命令行编辑快捷键: history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 !num 执行命令历史列表的第num条命令 !! 执行上一条命令 ...
- [Objective-C语言教程]命令行参数(23)
执行时,可以将一些值从命令行传递给Objective-C程序. 这些值称为命令行参数,很多时候它们对程序很重要,特别是当想要从外部控制程序而不是在代码中对这些值进行硬编码时就很有用了. 命令行参数使用 ...
随机推荐
- 用Gearman分发PHP应用程序的工作负载
文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/518 虽然一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体如今 ...
- 延迟加载-association来实现
resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关 ...
- 跟 Google 学 machineLearning [1] -- hello sklearn
时至今日,我才发现 machineLearning 的应用门槛已经被降到了这么低,简直唾手可得.我实在找不到任何理由不对它进入深入了解.如标题,感谢 Google 为这项技术发展作出的贡献.当然,可能 ...
- js setTimeout setInterval 第三个参数说明
1.api setTimeout: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setTimeout var timeoutID = ...
- OpenERP 7中 openerp-server.conf 的解释
服务器启动配置 – 通用项 程序代码: [选择] # Admin password for creating, restoring and backing up databases admin_pas ...
- 【转】Jenkins怎么启动和停止服务
笔者没有把Jenkins配置到tomcat中,每次都是用命令行来启动Jenkins.但是遇到一个问题:Jenkins一直是开着的,想关闭也关闭不了.百度了一些资料,均不靠谱(必须吐槽一下百度).于是进 ...
- 二维码Data Matrix简单介绍及在VS2010中的编译
Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matrix二维条码 ...
- Oracle 中TNS的作用
什么是TNS? TNS是Oracle Net的一部分,专门用来管理和配置Oracle数据库和client连接的一个工具,在大多数情况下client和数据库要通讯,必须配置TNS,当然在少数情况下,不用 ...
- Alamofire使用报错Extra argument 'method' in call解决办法
使用Alamofire的时候,在用这句的时候报错了: Extra argument 'method' in call Alamofire.request("", method: H ...
- MATLAB 的 cell 大法(单元格数组)
MATLAB 的 cell,称单元格数组 or 元胞数组:使用频率特别高,甚至比 struct 结构体还高. MATLAB文档给出的 cell 官方定义: A cell array is a coll ...