【发布时间】:2018-09-20 10:48:50
【问题描述】:
我正在尝试按单个字段对包含数百万行的集合进行完全排序。 据我所知,ObjectId 包含 4 个字节的时间戳。我的时间戳是 4 字节整数索引字段。所以我想按 _id 和时间戳排序应该是相似的,但这里是结果
db.coll.find().sort("_id", pymongo.ASCENDING)
# takes 25 minutes to run
和
db.coll.find().sort("timestamp", pymongo.ASCENDING)
# takes 2 hours to run
为什么会发生这种情况,这是优化它的方法吗? 谢谢
更新
我尝试排序的时间戳字段已按我的指示编入索引
收集统计数据
"size" : 55881082188,
"count" : 126048972,
"avgObjSize" : 443,
"storageSize" : 16998031360,
"capped" : false,
"nindexes" : 2,
"totalIndexSize" : 2439606272,
我致力于 mongodb 进程 4gb 的 ram(试图增加到 8gb 但速度没有增加)
更新 2
事实证明有多少字段顺序遵循插入(自然)顺序,所以排序速度更快
我试过了
db.new_coll.create_index([("timestamp", pymongo.ASCENDING)])
for el in db.coll.find().sort("timestamp", pymongo.ASCENDING):
del el['_id']
db.new_coll.insert(el)
# and now
db.new_coll.find().sort("timestamp", pymongo.ASCENDING)
# takes 25 minutes vs 2 hours as in previous example
【问题讨论】:
-
你使用的时间戳字段是什么格式的?
-
@PardeepSingh 4 字节 Unix 时间(如 1523386147)
-
说真的,即使您在
_id上进行排序也需要相当长的时间。我假设要么我们的 RAM 有问题,要么我们正在谈论一个分片集群。请在您的问题by editing it 中添加有关您的 RAM 利用率和设置的信息,包括数据库的大小(大小,不仅仅是条目数!)。旁注:MongoDB 中没有行的概念。越早停止对 MongoDB 应用 SQL 思维方式越好。
标签: mongodb mongodb-query pymongo