在简单但大的数据库中对小集合进行 mongoDB 查询速度慢得离谱

2024-03-20

所以我在 mongoDB 中有一个超级简单的数据库,其中有一些集合:

> show collections
Aggregates <-- count: 92
Users <-- count: 68222
Pages <-- count: 1728288847, about 1.1TB
system.indexes

The Aggregates集合是集合的集合Pages集合,每个文档如下所示:

> db.Aggregates.findOne()
{
        "_id" : ObjectId("50f237126ba71610eab3aaa5"),
        "daily_total_pages" : 16929799,
        "day" : 21,
        "month" : 9,
        "year" : 2011
}

很简单。不过,让我们尝试通过添加所有 92 天来获得总页面加载量daily page loads一起:

>>> def get_total():
...     start = datetime.now()
...     print sum([x['daily_total_pages'] for x in c.Aggregates.find()])
...     end = datetime.now()
...     print (end-start).seconds
...
>>> get_total()
1728288847
43

43秒?!?!?!?!

这 92 个合计结果很小!我还不如将它们存储在文本文件中,这太疯狂了。

或者它们很小?根据 mongo,它们在磁盘上有多大?

> db.Aggregates.stats()
{
        "ns" : "c.AggregateResults",
        "count" : 92,
        "size" : 460250104,
        "avgObjSize" : 5002718.521739131,
        "storageSize" : 729464832,
        "numExtents" : 7,
        "nindexes" : 2,
        "lastExtentSize" : 355647488,
        "paddingFactor" : 1.0690000000000066,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 16352,
        "indexSizes" : {
                "_id_" : 8176,
                "date_1" : 8176
        },
        "ok" : 1
}

每天这些微小的数字总计 438 MB?每一个大约为 280 字节,因此总共最多应为 25~30kb。所以存储巨大,查询超级慢。它有可能在磁盘上产生碎片吗?我将文档插入完整的文档后创建了聚合Pages收藏。

有人对这种疯狂有任何见解吗? :哦


编辑:通过 Jared 更具体的 find() 查询解决了。 Sammaye 提供的下面的视频也提供了一些非常有趣的存储见解。


编辑2:所以我发现使用 sys.getsizeof() 是really找出文档大小的不可靠方法,因为它不会递归到任何树上。所以实际上我的文档非常大,最好的办法是使用 find({}, {'daily_page_loads'}) 作为更具体的查询!


The avgObjSize与 280 字节的估计不一致。这表示您的对象平均大小约为 5MB,storageSize接近1GB。如果内存有限,运行需要访问所有 1GB 文件的查询会导致大量页面错误。

你有没有尝试过压实 http://docs.mongodb.org/manual/reference/command/compact/?

db.runCommand({compact: 'Aggregates'})

or 修理 http://docs.mongodb.org/manual/reference/command/repairDatabase/?

db.repairDatabase()

如果这不起作用,请尝试仅撤回求和所需的那些字段,而不是撤回整个文档。这些文档可能实际上有 5MB,并且时间花在通过网络提取数据上。

def get_total():
    start = datetime.now()
    print sum([x['daily_total_pages'] for x in c.Aggregates.find({}, {"daily_total_pages": 1})])
    end = datetime.now()
    print (end-start).seconds
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在简单但大的数据库中对小集合进行 mongoDB 查询速度慢得离谱 的相关文章

  • 如何使用 .schema 文件在 sqlite3 中创建 DB 文件

    我们的客户向我们提供了一个名为db schema 现在有一个命令可以用来运行这个文件来创建一个 dbsqlite3 中的文件 我可以做到这一点而不必输入中提到的所有查询吗db schema file 请帮忙 谢谢 如果该文件仅包含格式正确的
  • 始终保持数据库连接打开可以吗?

    我在业余时间从事单用户桌面数据库应用程序之类的工作 并且我总是不确定我所做的设计选择 现在 就目前情况而言 每当用户想要与数据库 这是一个本地 SQLite 数据库 因此通常只有一个用户一次看到它 交互时 应用程序就会创建一个新连接 执行它
  • 将图像文件存储在猫鼬模式的二进制数据中并以html形式显示图像

    我正在使用 Express Node js 和 Mongodb 创建上传和显示图像文件的网页 我使用 schema 将图像的二进制文件保存在 mongodb 中 这是我在index js和db js中的一点代码 var Post mongo
  • 具有多个数据源 Oracle 和 H2 的 Spring Boot

    我为我的 Angular 项目开发了一个 Spring Boot RestController 并遇到了问题 在我的休息服务逻辑中 我使用了两个不同的数据库来获取数据 在这里您可以看到数据源配置 应用程序 属性 datasource1 sp
  • 如何分析Android应用程序的电池使用情况并对其进行优化?

    我想分析我的应用程序的电池使用情况 我的意思是应用程序的各个部分 例如 广播接收器 监听器 服务等 使用多少电池 我需要一个详细的列表 从列表中 我想优化电池的使用 方法与使用内存分析器类似 http android developers
  • 根据代码版本测试和管理数据库版本

    当您开发应用程序时 数据库的更改不可避免地会出现 我发现的技巧是让数据库构建与代码保持同步 过去 我添加了一个针对目标数据库执行 SQL 脚本的构建步骤 但这很危险 因为您可能会无意中添加虚假数据或更糟的情况 我的问题是保持数据库与代码同步
  • 如何优化 postgres 查询

    我正在运行以下查询 SELECT fat FROM Table1 fat LEFT JOIN modo captura mc ON mc id fat modo captura id INNER JOIN loja lj ON lj id
  • MongoDB - 解释特定的解释输出

    我使用的是 MongoDB 版本 2 4 8 test 2014 03 25 14 42 13 0 gt gt gt db users getIndexes v 1 key id 1 ns test users name id v 1 ke
  • 如何使用 mongo-go-driver 有效地将 bson 转换为 json?

    我想将 bson 转换为mongo go 驱动程序 https github com mongodb mongo go driver有效地转换为 json 我应该小心处理NaN 因为json Marshal失败如果NaN存在于数据中 例如
  • 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

    我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 映像 并且数据库上已经有数据 如果我停止虚拟机 以节省过夜费用 我会丢失数据库中包含的所有数据吗 在这些情况下我怎样才能让它持久 有多种选择可以实现此目的 但
  • 重命名($project)数组中的字段 - MongoDB [重复]

    这个问题在这里已经有答案了 我有一个类似以下的文件 id 59ba903dacea50d0d7d47168 sections id 59d9dd7947ce651544c5d4c1 sectionName Section 1 id 59d9
  • 如何减少 JSF 中的 javax.faces.ViewState

    减少 JSF 中视图状态隐藏字段大小的最佳方法是什么 我注意到我的视图状态约为 40k 这会在每次请求和响应时下降到客户端并返回到服务器 特别是到达服务器时 这对用户来说会显着减慢 我的环境 JSF 1 2 MyFaces Tomcat T
  • 用于客户端存储和服务器端同步的javascript库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我将数据存储在客户端数据库中 并在后台自动将数据库同
  • 从 XML 构建树结构的速度很慢

    我正在将 XML 文档解析为我自己的结构 但对于大型输入来说构建它非常慢 是否有更好的方法来做到这一点 public static DomTree
  • 何时使用 JCR(内容存储库)而不是其他选项?

    我正在尝试评估内容存储库 JSR283 http www jcp org en jsr detail id 283 like 长耳大野兔 http jackrabbit apache org and 模式形状 http www jboss
  • Rails 中的多列主键

    我正在尝试将桌面应用程序迁移到rails 还处理相当老式的现有数据库 问题是我在一列中没有唯一的 ID 但表的三列保证了记录的唯一性 鉴于我有三个表 authors author name author letter author nr1
  • 什么是悲观主义?

    该问题有评论可以使用C 11的吗auto提高性能 https stackoverflow com questions 32510183 can the use of c11s auto improve performance这获得了很多选票
  • 当我尝试连接到数据库时收到“错误:无法初始化 OLE”? C#

    我正在尝试通过 C 连接到数据库 但这样做时收到一条非常无用的错误消息 08 44 17 错误 无法初始化 OLE 08 44 17 错误 无法初始化 OLE 我尝试寻找解决方案 但没有成功 我也尝试重新启动计算机 但这也没有帮助 我正在运
  • 从数组中查找前 N 个条目

    我的收藏结构如下 id 1 Trips EndID 5 Tripcount 12 EndID 6 Tripcount 19 id 2 Trips EndID 4 Tripcount 12 EndID 5 Tripcount 1
  • 防止 Django 在并发请求时多次将同一对象保存到数据库

    对于我们的博客平台 我们有一个 文章 模型 其中包含一个 更新的 日期时间字段 class Article models Model updated models DateTimeField null True blank True 当任何

随机推荐