【发布时间】:2014-03-27 17:47:23
【问题描述】:
我的 mongodb 相当简单:一个数据集/条目在 3 层上有大约 30 个属性。一个这样的条目最多有大约 5000 个字符。我有500k。 当我执行以下查询时...
db.images.find({ "featureData.cedd": { $exists: false}}).count()
...它非常慢。它没有被索引,但仍然......根据我的 MySQL 经验,执行一个这样的查询不应该花费 20 分钟。
在执行时(直接在 mongo 终端上)有 3% 的 CPU 使用率和超过 2 Gigs 的可用内存。
感谢您提示我可以做什么!
编辑:查询的解释()(不计)给出:
db.images.find({ "featureData.cedd": { $exists: false }}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 532537,
"nscannedObjects" : 532537,
"n" : 438,
"millis" : 1170403,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
iostat 的输出:
Linux 3.2.0-58-generic (campartex) 03/25/2014 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
34.93 0.01 0.25 0.48 0.00 64.33
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 2.08 103.79 11.26 172805914 18749067
fd0 0.00 0.00 0.00 148 0
explain() 添加索引后的输出:
db.images.find({ "featureData.cedd": { $exists: false }}).explain()
{
"cursor" : "BtreeCursor featureData.cedd_1",
"nscanned" : 438,
"nscannedObjects" : 438,
"n" : 438,
"millis" : 2,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"featureData.cedd" : [
[
null,
null
]
]
}
}
【问题讨论】:
-
explain查询总是一个好的第一步 -
顺便说一句,在写诸如“计算 mongo 必须遍历所有元组”之类的东西之前,请考虑一下,我们在这里谈论 15 分钟,只有 50 万条记录。:)
-
我只能找到一个“explain()”,没有描述。 “解释”现在运行了 1 分钟 x/ CPU 和内存使用率一样低
-
explain() 尚未终止。有的话我就写到这里^^
-
磁盘 IO 可能受限。 iostat 是怎么说的?
标签: mongodb