2012-09-28 87 views
2

我们有一个包含近4000万条记录的MongoDB集合。目前这个系列的尺寸是5GB。存储在此集合中的数据包含以下字段:MongoDB索引

_id: "MongoDB id" 
userid: "user id" (int) 
mobile: "users mobile number" (int) 
transaction: "transaction id" (int) 
sms: "message sent to user mobile" (text) 
created_dt: "unix timestamp of the transaction" 

除了对_id索引(默认创建的),我们在移动和交易字段定义单独的索引。

然而,下面的查询需要60到120秒之间的任何地方完成:

{ 
    mobile:<users mobile number> 
} 

我的MongoDB使用RockMongo访问。 MongoDB在16GB RAM的服务器上托管。该服务器上近8GB的RAM是免费的。

这是什么我在这里做错了?

更新:

的输出解释:mongostat的

{ 
    "cursor" : "BasicCursor", 
    "nscanned" : 37145516, 
    "nscannedObjects" : 37145516, 
    "n" : 37145516, 
    "millis" : 296040, 
    "nYields" : 1343, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
    } 
} 

输出在

insert query update delete getmore command flushes mapped vsize res faults locked % idx miss %  qr|qw ar|aw netIn netOut conn  time 
    13  2  0  0  0  1  0 168g 336g 6.86g  1  1   0  0|0  1|0 21k  1k 19 11:30:04 
    16  0  0  0  0  1  0 168g 336g 6.88g  0  0.1   0  0|0  1|0 21k  1k 19 11:30:05 
    14  0  0  0  0  1  0 168g 336g 6.86g  0  0   0  0|0  1|0 29k  1k 19 11:30:06 
    10  0  0  0  0  1  0 168g 336g 6.86g  0  0   0  0|0  1|0 19k  1k 19 11:30:07 
    16  0  0  0  0  1  0 168g 336g 6.88g  0  0.1   0  0|0  1|0 21k  1k 19 11:30:08 
    9  0  0  0  0  1  0 168g 336g 6.89g  0  0   0  0|0  1|0 13k  1k 19 11:30:09 
    19  0  0  0  0  1  0 168g 336g 6.89g  0  0   0  0|0  1|0 27k  1k 19 11:30:10 
    12  0  0  0  0  1  0 168g 336g 6.89g  1  1.2   0  0|0  1|0 24k  1k 19 11:30:11 
    17  0  0  0  0  1  0 168g 336g 6.89g  1  1.7   0  0|0  1|0 31k  1k 19 11:30:12 
    15  0  0  0  0  1  0 168g 336g 6.89g  0  0   0  0|0  1|0 19k  1k 19 11:30:13 

更新2查询时间:

直到最近,我们用在同一个MongoDB服务器中存储另一个约13亿个文档的集合。此集合现在已被删除(删除)。这可以解释上面mongostat输出中的mapped/vsize列。

服务器还存储6个频繁插入的其他集合。目前总存储容量约为35GB。

更新3:收集定义

指标。使用RockMongo创建。

[ 
{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "mymongodb.transaction_sms_details", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "_transaction_mobile_" : 1 
    }, 
    "ns" : "mymongodb.transaction_sms_details", 
    "background" : 1, 
    "name" : "mobile" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "_transaction_transaction_" : 1 
    }, 
    "ns" : "mymongodb.transaction_sms_details", 
    "background" : 1, 
    "name" : "transaction" 
} 
] 
+0

你是否索引了移动领域? http://www.mongodb.org/display/DOCS/Indexes – sics

+0

这个问题说他们做了(三个_id,移动和交易索引)。 – Thilo

+0

每个手机号码返回多少个文件? – Thilo

回答

2

RockMongo生成的密钥显然是不正确的。

"_transaction_mobile_" : 1 
    "_transaction_transtion_" : 1 

我不知道什么是错RockMongo,但我认为这是可以解决这个问题:

db.xxx.dropIndexes(); 
db.xxx.ensureIndex({mobile: 1}); 
db.xxx.ensureIndex({transaction: 1}); 

注意:这可能需要很长的时间。不要在正在运行的生产机器上执行此操作。

+0

谢谢。 RockMongo允许编辑索引的名称以及要索引的字段的名称。我认为创建索引的人更新了字段名称而不是索引名称。 RockMongo没有检查以确保被索引的字段实际上存在于集合中。 – Nikhil

+0

您应该在后台操作模式下执行重新索引。 – AlphaB

+0

它可能不应该做一个检查,因为你可以为未来的领域添加索引。也许是警告...... :)至少你得到了你的解决方案! –