3

我的笔记本电脑(i7、SSD、16GB RAM)上运行了三个 mongod 进程的复制集。我创建了一个空数据库并向其中添加了一条 7MB 的记录。然后我从命令行查询该记录:

echo "db.items.find({_id:'.......'})" | mongo mydb >tmp/junk

客户端应用程序“mongo”(不是 mongod 或 mongos)在吐出响应之前会占用 100% CPU 几秒钟。如果我使用 MongoDB 的 Java 客户端读取记录,我的 JVM 进程会在几秒钟内使用 100% CPU,然后再给出响应。

这里会发生什么?我该如何解决这个问题?

更新:复制集似乎无关紧要;如果我将 mongo 直接连接到主 mongod,性能是一样的。

更新:PHP 客户端可以在几分之一秒内获取数据。世界卫生大会...?

4

2 回答 2

2

听起来需要mongo几秒钟才能将文档的 BSON 解码为 C++ 中的 Javascript 对象,而 Java 驱动程序将 BSON 解码为 Java 对象需要几秒钟。您可以使用's参数mongodump将该文档转储到bson文件中,然后尝试:mongodump--query

time bsondump file.bson > /dev/null

这将为您提供比较的基础:C++ 程序解码 BSON 文档并将其格式化为 JSON 所需的时间。如果这很长,那么文档的绝对大小就是主要成本。

于 2013-06-12T03:12:53.913 回答
0

真正的问题是为什么你有 7MB 的记录。那应该只是某个地方的文件,mongo 说“这个大东西的文件名是……”;那 7 MB 要么是存储得非常不正确的结构化数据,要么是一堆非结构化数据,在这种情况下,这绝对是一个文件系统作业。

也就是说,我期望发生的是它不仅匹配 id,而且验证那些 7MB。PHP 查询是否绕过验证?

于 2013-06-12T02:16:10.420 回答