首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB + SpringData查询非常慢

MongoDB + SpringData查询非常慢
EN

Stack Overflow用户
提问于 2012-10-25 06:34:28
回答 1查看 3.8K关注 0票数 2

我有一个简单的课程:

代码语言:javascript
复制
@Document (collection = "advertise")
public class AdvertiseCache {
    @Id
    private int id;

    private int brandId;
    private String brandName;
    private String modelName;

    @Indexed
    private int odometer;

    @Indexed
    private int price;
    private boolean learner;
    private int manufacturedYear;
    private double engineSize;
    private String transmissionTypeName;
    private String stateName;
    private String ownerTypeName; //private/dealer
    private String conditionTypeName; //new/used
}

我有另一个类,它具有相同的属性,但带有@Entity注解。

它们分别存储在MongoDB和PostgreSQL中。

我使用Spring进行PostgreSQL和Spring数据MongoDB .为了芒果。

这两个数据库包含相同的数据,30行。

  • 10000次findAll类型查询将花费: Mongo ~8000~9000 of和PostgreSQL ~10000~11000 of
  • 10000查询findAll类型,其中价格>=1和价格<=9000和里程计>=1和里程计<= 40000将花费: Mongo:~7000 of和PostgreSQL ~7200 of

为什么?我做错什么了吗?,我以为芒果会快得多。(我很少使用我的应用程序大多数情况下,我使用过滤器进行排序)

这两台服务器都运行在FreeBSD 9虚拟机中。我用CentOS 6.3在另一个VM上测试了这一点。类似的结果+-100。

Tnx

/更多用于解释的代码(我的筛选器构建器将只包含odometerMin、odometerMax表示标准之间、priceMin和priceMax用于标准之间:

代码语言:javascript
复制
public List<AdvertiseCache> findByFilter(FilterBuilder filter) {
    List<AdvertiseCache> result = null;
    Query query = new Query();
    Criteria criteria = new Criteria();
    criteria = criteria.and("price").gte(filter.getPriceMin()).lte(filter.getPriceMax());
    criteria = criteria.and("odometer").gte(filter.getOdometerMin()).lte(filter.getOdometerMax()); 
    query.addCriteria(criteria);
    query.limit(filter.getLimit());
    query.skip(filter.getOffset());
    result = mongoTemplate.find(query, AdvertiseCache.class, collectionName);
    return result;
}
EN

回答 1

Stack Overflow用户

发布于 2013-06-27 21:21:07

我不确定我在这里是否有挫败感。或者更准确地说:你认为什么太慢/应该更快?如果我正确地读取了您的数据点,那么每个执行的查询仍不到1ms。

您可能需要改进一下您的测试场景:

  1. 您的数据模型相当简单,原语的集合并不能真正让蒙古人发亮。如果您可以直接存储聚合,而不是像必须与关系存储一样将它们连接到一起,那么它将优于关系数据库。
  2. 您的访问模式是微不足道的, findAll(…)只是将数据流回客户端,并且可能也针对Postgres进行了很好的优化。如果正确设置了索引,Postgres和Mongo就不会有太大的不同。另外,简单的范围查询也不让Mongo真正出类拔萃。这基本上可以归结为1,如果您得到了一个更复杂的数据模型,并且连接在关系世界中开始堆积,您就会看到这种差异。
  3. 你读的是小数据, 30行/文档就是什么都不是。要查看差异,需要增加要返回的文档/行的数量。如果这样做,请确保将苹果与苹果进行比较:使用Spring,您可以得到文档到对象的映射,这在普通的JDBC中是无法得到的。

我得出两个结论:

  1. 除了您看到的任何结果,对于Postgres或一般的关系方法来说,都是一个令人震惊的结果。MongoDB是一个很好的数据库,但是如果在这样简单的情况下(非常简单的模型、非常简单的查询、非常少的数据)超出了关系,这难道不让关系看起来像玩具吗?他们不是。他们只是有一些特点,使他们在某些情况下是次优选择,但在其他情况下甚至可能表现得更好。绩效是决策的一个方面。从存储中获取数据是另一件容易的事情,可扩展性也是如此。
  2. 如果您真的要进行商店比较,请确保在正确的抽象级别上进行比较。对于MongoDB,这可能是Postgres端的原始驱动程序API。如果你把O(R,D)M带入游戏中,你会比较商店+映射器框架,这可能会扭曲结果。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13062897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档