【问题标题】:q.setOrder(...) extremely slow in DataNucleus + MongoDBq.setOrder(...) 在 DataNucleus + MongoDB 中非常慢
【发布时间】:2013-01-11 18:12:47
【问题描述】:

我有一个带有 MongoDB 数据存储和 JDO 实现的最新稳定 DataNucleus (3.0.1)。 该集合有大约 100 万份文档。 “id”字段被索引。 这段代码需要几分钟才能执行:

Query q = pm.newQuery(CellMeasurement.class);
q.setOrdering("id descending");
q.setRange(0, count);
Collection<CellMeasurement> result = (Collection<CellMeasurement>)q.execute();

如果我删除 q.setOrdering(...) 一切正常,对于 count=1000 加载大约需要一秒钟。

看起来 DN 进行了内存重新排序,这有什么意义吗? MongoDB 本身通过这个索引字段即时排序,API 支持排序..

有什么想法吗?谢谢。

【问题讨论】:

  • 显然 3.0.1 不符合“最新稳定”(2011 年 8 月)的条件,因为每个月或多或少都有发布,并且每个发布都是“稳定的”
  • 对不起,我错了,我使用的是 3.2.0 m2 构建。我也检查了当前的主干,它有相同的 TODO,所以无论如何它都不会工作。很抱歉造成混乱。

标签: mongodb jdo datanucleus nosql


【解决方案1】:

查看日志(对于任何应用程序)显然会发现很多;在这种情况下,实际执行的是什么查询。在这种情况下,它会很容易地告诉您,当前没有实现排序以在数据存储中执行。

显然,任何人都可以为此类自首次发布以来一直是开源的代码库做出贡献。 org.datanucleus.store.mongodb.query.QueryToMongoDBMapper 方法“compileOrdering”是您需要实现的地方,然后在完成后将补丁附加到 JIRA 问题。谢谢

【讨论】:

  • 不幸的是,我现在正处于项目开发的最后一步,没有时间研究 DN 插件。你是对的,这个函数有 TODO,因此排序是在内存中处理的。顺便说一句,.setRange() 也是如此。现在我使用本地 mongodb 库在本地实现了这个功能。完成项目后,我将尝试为商店插件做出贡献。谢谢。
猜你喜欢
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2015-11-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
相关资源
最近更新 更多