我一直在致力于一个项目来评估 mongodb 与其他数据存储相比的速度。为此,我尝试对我制作的集合执行完整扫描。我发现了探查器,所以我启用了它并设置为记录每个查询。我有一个包含一百万个对象的集合,我正在尝试计算扫描该集合所需的时间。不幸的是,当我运行时
db.sampledata.find()
它会立即将光标返回到 1000 个左右的对象。所以我编写了一个 python 脚本来迭代光标来处理所有结果。这是:
from pymongo import MongoClient
client = MongoClient()
db = client.argocompdb
data = db.sampledata
count = 0
my_info = data.find()
for row in my_info:
count += 1
print count
这似乎需要必要的时间。然而,当我检查探查器时,没有完整查询时间的总量,它只是一整套“getmore”操作,每个操作需要 3-6 毫秒。有什么办法可以使用探查器来完成我想要做的事情,而不是在 python 中计时?我本质上只是想:
- 能够执行查询并让它返回所有结果 仅光标中的少数几个。
- 为分析器中的“完整查询”争取时间。获得所有结果所需的时间。
我想做的事情可行吗?
我对 MongoDB 很陌生,所以如果之前有人问过这个问题,但我找不到任何内容,我感到非常抱歉。
最佳答案
分析器正在测量正确的东西。 Mongo 驱动程序不会立即返回集合中的所有记录;它首先为您提供一个光标,然后在您遍历光标时逐一输入文档。因此分析器正在准确测量正在执行的操作。
我认为这是一个比您正在寻求的指标更正确的指标,我认为这是实际将所有文档读入客户端所需的时间。您实际上不希望 Mongo 驱动程序在返回之前将所有文档读入内存。如果以这种方式编写,任何应用程序都不会表现良好,除了最小的集合之外。客户端按需读取文档的速度要快得多,因此需要最小的总内存占用。
此外,您将其与什么进行比较?如果您要与关系数据库进行比较,那么关系数据库中的模式以及 Mongo 中的集合和文档的外观非常重要。当然,还有每个索引是如何建立的。不同的选择可能会产生截然不同的性能结果,这并不是数据库引擎的错误。
Mongo 中最简单、因此最快的操作可能是通过 id
检索小文档,该文档始终被索引:db.collection.find({id: .. .})
。但如果您确实想测量线性扫描,那么文档越小,扫描速度就越快。但实际上,这并不是很有用,因为它基本上只测量服务器从磁盘读取数据的速度。
关于python - 在 MongoDB find() 中返回完整结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985138/