私はこの単純なクラスを持っています:
@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 にそれぞれ格納されます。
PostgreSQL には Spring Data JPA を、mongo には Spring Data MongoDB を使用しています。
両方のデータベースには、同じデータ (30 行) が含まれています。
findAll タイプの 10000 クエリのコスト: Mongo ~8000-9000ms および PostgreSQL ~10000-11000ms
price >= 1 and price <=9000 and odometer >=1 and odometer <= 40000 であるタイプ findAll の 10000 クエリのコスト: Mongo: ~7000ms および PostgreSQL ~7200ms
なぜ?私は何か間違ったことをしていますか?私はmongoがはるかに速いと思っていました。(私のアプリケーションでは、すべてを検索することはめったにありません。ほとんどの場合、並べ替えにフィルターを使用します)
どちらのサーバーも FreeBSD 9 仮想マシンで実行されています。CentOS 6.3 を搭載した別の VM でこれをテストしました。同様の結果 +-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;
}