【发布时间】:2014-03-13 10:10:36
【问题描述】:
一个集合中有 30,000,000 条记录。 当我通过 java 对这个集合使用 distinct 命令时,大约需要 4 分钟,结果的计数约为 40,000。 mongodb的distinct操作就这么低效吗? 我怎样才能让它更有效率?
【问题讨论】:
一个集合中有 30,000,000 条记录。 当我通过 java 对这个集合使用 distinct 命令时,大约需要 4 分钟,结果的计数约为 40,000。 mongodb的distinct操作就这么低效吗? 我怎样才能让它更有效率?
【问题讨论】:
mongodb的distinct操作就这么低效吗?
30m 记录?我会说 4 分钟其实相当不错,我认为这和 SQL 一样快,也许比 SQL 快一点。
在说效率低之前,我可能会在其他数据库中对此进行测试。
但是,查看性能的一种方法是查看该字段是否首先被索引,以及该索引是否在 RAM 中或可以在没有页面抖动的情况下加载。只要字段有索引,distinct() 就可以使用索引。
我怎样才能提高效率?
您可以使用几种方法:
这是解决这个问题的两种最可行的方法。
Distinct() 并没有过时,如果它符合您的需求,它实际上比 $group 性能更高,因为它可以使用索引。
【讨论】:
.distinct() 操作是一个旧操作,.group() 也是如此。一般来说,这些已被.aggregate() 取代,通常应优先使用这些操作:
db.collection.aggregate([
{ "$group": {
"_id": "$field",
"count": { "$sum": 1 }
}
)
用您希望从中获得不同计数的任何字段替换"$field"。 $ 为字段名称添加前缀以分配值。
查看文档,尤其是 $group 了解更多信息。
【讨论】: