Pymongo 明显比 mongo shell 慢?

问题描述 投票:0回答:1

我对 mongodb 比较陌生,并且在 pymongo 中遇到性能问题。我有一个 50 GB(未压缩)和 20 GB(通过 WiredTiger 压缩)的集合,包含大约 3900 万个文档。通过索引字段查询会得到大约 125,000 个文档和 150 MB 未压缩的结果。当我在 mongo shell 中执行以下操作时,大约需要一秒钟。

var result = db.my_collection.find(my_query).toArray()

但是,当我在 pymongo 中做同样的事情时,需要超过 7 秒。

db = pymongo.MongoClient()['my_db']
result = list(db['my_collection'].find(my_query)) 

一些额外信息:

  • 我使用的是 Ubuntu 14.04、python 2.7.6、pymongo 3.2 和 mongo 3.2。

  • 我认为我的 pymongo 配置为使用 C,因为我安装了 python-dev 并且 pymongo.has_c() 和 bson.has_c() 都显示 True。

  • 一切都在本地运行。

我很难相信 pymongo 比 mongo shell 慢 7 倍。我错过了什么?

python mongodb shell pymongo
1个回答
0
投票

可能有以下一个或多个原因导致此类行为。

  1. 查询执行时数据库上的负载以及执行这两个操作的顺序会极大地影响查询的响应时间。例如 - 如果您首先使用 pymongo 进行查询,WiredTiger 可能会从磁盘加载数据。从 mongo shell 执行相同的查询时,数据已存在于 WiredTiger 缓存中(因为使用 pymongo 进行的第一个查询)。

  2. 使用 pymongo 客户端查询数据库时,第一个请求通常比后续请求非常慢。您可以通过执行以下操作自行检查 -

     db = pymongo.MongoClient()['my_db']
     result = list(db['my_collection'].find(my_query))
     #make another query returning same amount of data
     result_2 = list(db['my_collection'].find(my_query_2))
    

    你会发现“result”会比“result_2”花费更多的时间。所以第一个请求的执行时间通常很长,对于性能分析来说并不可靠。

  3. 正如你已经提到的,解析 mongo 文档并将其转换为 python 对象也需要一些时间。

© www.soinside.com 2019 - 2024. All rights reserved.