客户是pymongo。
该计划已运行一周。以前插入数据确实非常快:大约1000万/ 30分钟。
但今天我发现插入操作变得非常慢。
现在货物收集中有大约1.2亿条记录。
> db.goods.count()
123535156
货物收集的索引如下:
db.goods.getIndexes();
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "shop.goods",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"item_id" : 1,
"updated_at" : -1
},
"unique" : true,
"ns" : "shop.goods",
"name" : "item_id_1_updated_at_-1"
},
{
"v" : 1,
"key" : {
"updated_at" : 1
},
"ns" : "shop.goods",
"name" : "updated_at_1"
},
{
"v" : 1,
"key" : {
"item_id" : 1
},
"ns" : "shop.goods",
"name" : "item_id_1"
}
]
并且有足够的RAM和CPU。
有人告诉我,因为记录太多了。但是没有告诉我如何解决这个问题。我对MongoDB有点失望。
将来需要存储更多数据(每天约有5000万条新记录)。有没有解决方案?
在另一个服务器上遇到相同的情况(这次数据少,总数约为4000万),当前插入速度约为每秒5条记录。
> db.products.stats()
{
"ns" : "c2c.products",
"count" : 42389635,
"size" : 554721283200,
"avgObjSize" : 13086.248164203349,
"storageSize" : 560415723712,
"numExtents" : 283,
"nindexes" : 3,
"lastExtentSize" : 2146426864,
"paddingFactor" : 1.0000000000132128,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 4257185968,
"indexSizes" : {
"_id_" : 1375325840,
"product_id_1" : 1687460992,
"created_at_1" : 1194399136
},
"ok" : 1
}
答案 0 :(得分:0)
我不知道这是不是你的问题,但请记住,MongoDB必须更新每个插入的索引。因此,如果您有许多索引和许多文档,性能可能会低于预期。
也许,您可以使用分片加速插入操作。你没有在你的问题中提到它,所以我猜你没有使用它。
无论如何,你能提供更多信息吗?您可以使用db.goods.stats(),db.ServerStatus或any of theese other methods来收集有关数据库性能的信息。
答案 1 :(得分:0)
另一个可能的问题是IO。根据您的情况,Mongo可能正在忙于为后续插入语句增加或分配给定命名空间(即DB)的存储文件。如果您的测试模式已添加记录/删除记录/添加记录/删除记录,则您可能会重用现有的已分配空间。如果您的应用程序现在运行的时间比以前更长,那么您可能处于我所描述的情况。
希望这可以说明你的情况。
答案 2 :(得分:0)
我有一个非常类似的问题。
首先,您需要确定哪个是您的瓶颈(CPU,内存和磁盘IO)。我使用几个unix工具(如top,iotop等)来检测瓶颈。在我的情况下,我发现插入速度滞后于IO速度,因为mongod经常占用99%的io。 (注意:我原来的db使用了mmapv1存储引擎)。
我的工作是将存储引擎更改为wiretiger。 (通过mongodump你的原始数据库然后mongorestore转换成有线格式,或者用有线引擎启动一个新的mongod,然后从其他副本集重新同步。)这样做之后我的插入速度恢复正常。
然而,我仍然不确定为什么mofod与mmapv1在文档大小达到一定程度后突然耗尽了IO用法。