问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用mongodb作为数据库服务器访问时非常慢?

发布网友 发布时间:2022-04-29 23:33

我来回答

3个回答

懂视网 时间:2022-04-30 03:54

1:想知道哪些操作拖慢了MongoDB的速度,首先需要检查当前正在执行哪些操作。

gechongrepl:PRIMARY> db.currentOp()
"opid" : 78891,#操作的唯一标识符,可通过它来终止操作
"active" : true,#true表示当前正在运行,false表示此操作已交出或在等待其他操作交出锁
"secs_running" : 1,#查看执行时间,可以通过该参数定位耗时的操作
"microsecs_running" : NumberLong(1081719),#
"op" : "getmore",#操作的类型,有查询、插入、更新、删除。数据库命令当查询处理
"ns" : "local.oplog.rs",
"query" : {
	
},
"client" : "192.168.91.132:55738",
"desc" : "conn1534",#可与日志信息联系起来,可以用来筛选相关的日志信息。
"threadId" : "0x7f91d77a5700",
"connectionId" : 1534,
"waitingForLock" : false,#表示该操作是否因正在等待其他操作交出锁而处于阻塞状态。
"numYields" : 0,#表示该操作交出锁,而使其他操作得以运行
"lockStats" : {
	"timeLockedMicros" : {
		"r" : NumberLong(68),
		"w" : NumberLong(0)
	},
	"timeAcquiringMicros" : {#表示该操作需要多长时间才能取得所需的锁
		"r" : NumberLong(7),
		"w" : NumberLong(0)
	}
}

  

条件查询

gechongrepl:PRIMARY> db.currentOp({"ns":"local.oplog.rs"})
这里只是举个例子:通常不会终止ns:local.oplog.rs的,因为复制的线程会持续的向同步源请求更多的操作。如果被异常终止,MongoDB会重启他们,但是会短暂的中断复制。

  

如果发现特别耗时的查询可以终止操作

gechongrepl:PRIMARY> db.killOp(5299)
update和find和remove操作可以被终止。因为他们已经交出了锁。正在占用锁或者等待其他操作交出锁的操作则无法被终止

怪异现象:终止了一个批量插入的语句,最后发现还是插入完成了。因为批量插入操作请求之后会写在缓冲区中的。即使终止了客户端发送请求,MongoDB还会处理缓冲区的写入操作。如果需要解决这种现象最好的方式是使用应答式写入,即每次写入操作都会等待上一次写入操作完成后才会进行下去。

2:打开系统分析器

查看当前的分析器级别:

gechongrepl:PRIMARY> db.getProfilingLevel()

  

 

gechongrepl:PRIMARY> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 100, "ok" : 1 }

db.system.profile.find().pretty()

把级别设置为2意味着分析器会记录所有内容。数据库的所有读写请求都会写到system.profile中。这样会造成性能的损失,因为每一次写操作都会增加额外的写入时间,而每一次读操作都要等待写锁(因为它必须在system.profile集合中写入记录)

 

gechongrepl:PRIMARY> db.setProfilingLevel(1,100)
{ "was" : 2, "slowms" : 100, "ok" : 1 }

db.system.profile.find().pretty()

级别1分析器会默认记录耗时大于100ms的操作。可以自定义阀值

 

gechongrepl:PRIMARY> db.setProfilingLevel(1,500)
{ "was" : 1, "slowms" : 100, "ok" : 1 } 

db.system.profile.find().pretty()

  

gechongrepl:PRIMARY> db.setProfilingLevel(0)
{ "was" : 1, "slowms" : 500, "ok" : 1 }

0就是关闭分析器 

 

3:计算MongoDB的空间消耗

_id存储为ObjectId类型,比存储为字符串类型效率更高

gechongrepl:PRIMARY> Object.bsonsize({_id:ObjectId()})
22
gechongrepl:PRIMARY> Object.bsonsize({_id:""+ObjectId()})
39
也可以直接对集合中的文档进行查询:
gechongrepl:PRIMARY> Object.bsonsize(db.users.findOne())
0

  

查看集合大小

gechongrepl:PRIMARY> db.test.stats()
{
	"ns" : "test.test",
	"count" : 239000,
	"size" : 19728112,
	"avgObjSize" : 82,
	"storageSize" : 37797888,
	"numExtents" : 8,
	"nindexes" : 1,
	"lastExtentSize" : 15290368,
	"paddingFactor" : 1,
	"systemFlags" : 1,
	"userFlags" : 1,
	"totalIndexSize" : 7456512,
	"indexSizes" : {
		"_id_" : 7456512
	},
	"ok" : 1
}
gechongrepl:PRIMARY> 

  

以MB为单位显示

gechongrepl:PRIMARY> db.test.stats(1024*1024)
{
	"ns" : "test.test",
	"count" : 239000,
	"size" : 18,
	"avgObjSize" : 82,
	"storageSize" : 36,
	"numExtents" : 8,
	"nindexes" : 1,
	"lastExtentSize" : 14,
	"paddingFactor" : 1,
	"systemFlags" : 1,
	"userFlags" : 1,
	"totalIndexSize" : 7,
	"indexSizes" : {
		"_id_" : 7
	},
	"ok" : 1
}

  

数据库大小:

gechongrepl:PRIMARY> db.stats()
{
	"db" : "test",
	"collections" : 6,
	"objects" : 239035,
	"avgObjSize" : 82.56948145669044,
	"dataSize" : 19736996,
	"storageSize" : 38879232,
	"numExtents" : 13,
	"indexes" : 3,
	"indexSize" : 7472864,
	"fileSize" : 67108864,
	"nsSizeMB" : 16,
	"dataFileVersion" : {
		"major" : 4,
		"minor" : 5
	},
	"extentFreeList" : {
		"num" : 0,
		"totalSize" : 0
	},
	"ok" : 1
}

  

4:使用mongostat和mongotop查看

  

 

MongoDB副本集配置系列六:定位MongoDB慢的原因

标签:

热心网友 时间:2022-04-30 01:02

  你查看一下,如果数据文件大于系统内存,查询速度会下降几个数量级,因为mongodb是内存数据库。我以前测试过,1000万数据的时候没有索引情况下查询可能会几秒钟甚至更久。

  这种情况,你最好给经常查询的项创建索引,有索引以后查询速度会非常非常非常的快。

  另外一点是数据索引如果大于内存,速度也会下降很多。而且对于多条件查询,如果你查询的顺学和索引顺序不同,也不能使用索引。这个要慢慢摸索

  如果你使用了replica set,这个会影响写入速度的,三个replica set,速度会降低到三分之一。

  大概主要影响速度的就是这几点吧,如果你需求不是非常复杂,我以前测试mongodb速度方面优化好的情况下还是可以接受的。希望能帮到你

热心网友 时间:2022-04-30 02:20

因为mongodb使用memory-mapped file,所以mongodb运行时os会不停的把mongodb需要的数据库文件的部分内容读入物理内存里,所以:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何考电焊工证书和介绍 泰迪多大可以吃美毛粉 ...毛不是很密,长大后毛会密吗?假如不会有什么方法挽救? 吃美毛粉... 四个多月的泰迪需要吃美毛粉\'钙片\'营养膏之类的保健品吗?_百度知 ... 滚筒洗衣机需要安装洗衣机底座吗 关于电源o是开还是一是开(电源o是开还是一是开) 我帮单位运输柴油80升用铁桶装的,当时无证明,我不是车主,消防队查获交... 右脚脚脖子处起三个疙瘩很痒很痛 我的脚脖有几个像是蚊子咬的疙瘩,很痒 怎么做采购 哪种网络电视好? 网络电视哪种好 陌陌的一炮而红,究竟怎么发生的? 冒险到求情侣名字 女:伊沫沫丶 男:伊XX丶 求男的名字。。 求几个好听的小说名字 请各位高手帮忙想想名字 有谁知道GTA5里面的车速怎么显示出 GTA5调整画面质量超出*后就套用不了,请问如何关闭这一*呀?谢谢 gta5锁60帧怎么取消 为什么我的gta5开车只要车速一开的很快就非常卡 gta5忽略建议限制是什么意思 gta5怎么解除帧数限制 玩GTA5开不动车,按W键车子不动,但是下车后能前进,只是在车里不能前后移动,怎么办 gta5帧数被锁了怎么办 gta5单机汽车的速度怎么改 《gta5》怎么显示车速? 《GTA5》里面的如何显示车速? 捷渡行车记录仪内存卡连接电脑看录像 GTA5用游戏手柄玩能不能控制开车的速度?不是键盘上不停点按W键那种... 侠盗飞车gta5上买的车,灵蛇,不是1100匹马力最高350的时速吗,怎么开到140就上不去了 网络电视机哪个品牌好? 好的网络电视有哪些啊/ 生活中哪些产品设计不合理? 生活中有哪些不方便/不合理的产品设计? 生活中那些产品设计不合理?你对一些认为使用不便、功能不全的产品,希望做一些什么样改变以满足你的需要 生活中有哪些产品设计的不合理 华为手机录屏时没声音,还能还原吗?就是把没录上的声音给还原出来_百 ... 我们生活中有哪些产品设计不合理呢? 装修的过程中如果遇到设计的不合理该怎么办? 大家觉得生活中有什么不合理的产品设计吗? 急、请列举一些设计不合理的产品 生活中不合理的产品设计 在日常生活中,好多产品设计不是太合理,怎样才能给厂家联系,提出自己的意见,或修改建议? 遇到的过设计不合理或者使用不满意的产品/服务,你希望如何优化解决? 生活中有哪些不合理的设计元素? 生活中有哪些产品或生活用品设计的不合理 超市中有哪些产品包装设计不合理 生活中设计不合理的产品有哪些?工业设计专业用,谢谢 这附近24小时营业的自动取款机农行里在哪什么地方? 怎么查我附近有没有工行网点或自助机具?