【发布时间】:2011-10-05 07:48:38
【问题描述】:
我目前正在使用具有数百万条数据记录的 MongoDB。我发现了一件很烦人的事情。
当我使用 'count()' 函数来收集少量的查询数据时,它非常快。但是,当查询的数据集合包含数千甚至数百万条数据记录时,整个系统变得非常缓慢。
我确保我已为必填字段编制索引。
有人遇到过同样的事情吗?您如何改善这一点?
【问题讨论】:
标签: performance mongodb count
我目前正在使用具有数百万条数据记录的 MongoDB。我发现了一件很烦人的事情。
当我使用 'count()' 函数来收集少量的查询数据时,它非常快。但是,当查询的数据集合包含数千甚至数百万条数据记录时,整个系统变得非常缓慢。
我确保我已为必填字段编制索引。
有人遇到过同样的事情吗?您如何改善这一点?
【问题讨论】:
标签: performance mongodb count
【讨论】:
ensureIndex 自 3.0 起已弃用。请改用createIndex。
您可以确保在没有任何磁盘访问的情况下真正使用索引。
假设您要计算名称为“Andrei”的记录
您确保对名称进行索引(正如您所做的那样) 和
db.users.find({name:"andrei"}, {_id:0, name:1}).count()
您可以通过检查是否是最快的计数方式(预计算除外)
db.users.find({name:"andrei"}, {_id:0, name:1}).explain()
显示设置为 true 的 index_only 字段。
这个技巧将确保您的查询仅从内存(索引)而不是磁盘中检索记录。
【讨论】:
index_only 之类的操作执行count,那么这对我来说听起来很像一个错误。跨度>
你现在很不走运,在 mongodb 中的计数很糟糕,并且在不久的将来不会变得更好。见:https://jira.mongodb.org/browse/SERVER-1752
根据经验,您几乎不应该使用它,除非它是一次性的,很少发生的事情,或者您的数据库非常小。
正如@Andrew Orsich 所说,尽可能使用计数器(计数器的缺点是全局写锁定,但无论如何都比 count() 好)。
【讨论】:
对我来说,解决方案是将索引更改为 sparse。 视具体情况而定,有条件就试试吧。
db.Account.createIndex( { "date_checked_1": 1 }, { sparse: true } )
db.Account.find({
"dateChecked" : { $exists : true }
}).count()
318,000 条记录在集合中
【讨论】:
根据最新版本的 mongodb 4.4 添加我的观察结果。我有0.80 TB 集合大小。
我为我的收藏创建了一个索引 (UserObject.CountryID)。并运行此查询。
db.users.aggregate([
{
$match : {
"UserObject.CountryID" : 3
}
}]).group({_id: "Count", count: {$sum: 1}})
总共花了
0.80 TB 集合大小。0.80 TB 集合大小。0.80 TB 集合大小。【讨论】: