繁体   English   中英

MongoDB + SpringData查询非常慢

[英]MongoDB + SpringData Query very slow

我有这个简单的课程:

@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 Data JPA for PostgreSQL和Spring Data MongoDB ... for mongo。

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

  • 10000个findAll类型的查询将花费:Mongo~8000-9000ms和PostgreSQL~10000-11000ms

  • 10000个查询类型为findAll,其中price> = 1且price <= 9000且odometer> = 1且里程表<= 40000将花费:Mongo:~7000ms和PostgreSQL~7200ms

为什么? 难道我做错了什么? 我期待mongo更快。 (我的应用程序很少使用我只是找到所有。大多数时候我使用过滤器进行排序)

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

TNX

///更多解释代码(我的过滤器构建器将仅包含odometerMin,odometerMax用于标准之间,priceMin和priceMax用于标准之间:

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;
}

我不确定我是否在这里感到沮丧。 或者更确切地说:你觉得什么太慢/应该更快? 如果我正确读取了您的数据点,则每个执行的查询仍然不到1毫秒。

您可能想稍微改进您的测试场景:

  1. 您的数据模型相当简单。 一组原语并没有让Mongo真正发光。 如果您可以直接存储聚合而不是像在关系存储中那样将它们连接在一起,那么它优于关系数据库。

  2. 您的访问模式是微不足道的。 findAll(…)只是将数据流回客户端,也可能针对Postgres进行了优化。 如果您正确设置了索引,Postgres和Mongo不应该有太大差异。 此外,简单范围查询不会让Mongo真正出类拔萃。 这基本上都归结为1.如果你得到一个更复杂的数据模型,并且JOIN开始在关系世界堆积起来,你会看到差异。

  3. 你读了很少的数据。 30行/文件根本没什么。 要查看差异,您需要增加要返回的文档/行数。 如果你这样做,请确保你比较苹果和苹果:使用Spring Data MongoDB,你可以获得文档到对象的映射,这是普通JDBC无法实现的。

我得出两个结论:

  1. 除了你看到的结果之外,对于Postgres或一般的关系方法来说,这将是一个令人震惊的结果。 MongoDB是一个很棒的数据库,但是如果它在如此简单的情况下(非常简单的模型,非常简单的查询,非常少的数据)超过关系,那么关联看起来不会像玩具一样吗? 他们不是。 在某些情况下,它们只具有使其成为次优选择的特性,但在其他情况下甚至可能表现更好。 绩效是决策的一个方面。 易于将数据输入和输出存储是另一种方式,可扩展性也是如此。

  2. 如果您真的要进行商店比较,请确保在正确的抽象级别上进行比较。 对于MongoDB,这可能是Postgres端的原始驱动程序API与JDBC。 如果你将O(R | D)M带入游戏,你就会比较商店+映射器框架,这可能会扭曲结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM