【问题标题】:Will indexing make find_one() any faster?索引会使 find_one() 更快吗?
【发布时间】:2015-10-11 06:05:51
【问题描述】:

如果我有一个 pymongo 查询,在一个包含大约 4000 个文档的集合中,如下所示:

mong  =  pymongo.Connection()['ASD_2']['APS2'] 
py_mong = mong.find_one({'plate':'123456'})

考虑到在 find_one() 上不允许使用 .explain()["cursor"].explain()["nscanned"],因此手头没有方法可以找出扫描的性质,谁能告诉我是否值得在我只去的时候为集合编制索引使用find_one()

【问题讨论】:

  • 也许你可以用timeit模块试试?

标签: python python-2.7 indexing pymongo


【解决方案1】:

是的,绝对的。

我怎么知道?

首先,如果不这样做,那将是完全不可接受的。与find 相比,人们会抱怨find_one 令人惊讶且不必要的缓慢,开发团队会修复它(或冒被视为愚蠢的风险)。

其次,我检查了代码。实现正是您所期望的,这意味着 find_one 只是 find 的包装:

def find_one(self, spec_or_id=None, *args, **kwargs):
    if spec_or_id is not None and not isinstance(spec_or_id, dict):
        spec_or_id = {"_id": spec_or_id}
    for result in self.find(spec_or_id, *args, **kwargs).limit(-1):
        return result
    return None

(pymongo 2.4.2 版)

【讨论】:

    【解决方案2】:

    是的,索引将避免对请求的板进行线性搜索,并以对数时间工作(快得多)。

    【讨论】:

    • 但是您怎么知道,您如何确定使用find_one() 执行的扫描的性质?我知道它与find() 有很大的不同,但你确定它适用于find_one() 吗?
    • 没有理由不这样做。如果您不确定,请运行测试并找出答案!
    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 2023-03-03
    • 2016-06-28
    • 2014-03-20
    • 2010-12-29
    • 2022-01-08
    • 1970-01-01
    • 2013-04-15
    相关资源
    最近更新 更多