Java 如何正确索引查询的where条件?

Java 如何正确索引查询的where条件?,java,cqengine,Java,Cqengine,我有以下映射db行条目的pojo: public class Pojo{ //key private String a; private String b; private String c; //other columns private String d; private String e; private String f; //defining attributes on each field with capital letter (ex: a-

我有以下映射db行条目的pojo:

public class Pojo{
  //key
  private String a;
  private String b;
  private String c;

  //other columns
  private String d;
  private String e;
  private String f;

  //defining attributes on each field with capital letter (ex: a->A)
}
我创建以下集合:

IndexedCollection<Pojo> cq = new ConcurrentIndexedCollection<Pojo>();
//...loading data in collection from DB...
cq.addIndex(NavigableIndex.onAttribute(Pojo.A)); //part of key in DB
cq.addIndex(NavigableIndex.onAttribute(Pojo.F)); //not part of key in DB

但我的索引策略(我为查询的每个参数定义了一个索引)似乎缺少一些东西,因为与直接数据库访问相比,我的查询只加快了7毫秒的处理速度。内存中有所有的表,我希望有更好的性能……我做错了什么?

我是CQEngine的作者,所以我希望这能有所帮助。由于索引的配置方式,您可能会遇到过多的筛选

假设您有一组汽车对象,每个对象都有一个
COLOR
属性和一个
MANUFACTURER
属性

如果在
COLOR
上添加索引,在
MANUFACTURER
上添加单独的索引,那么CQEngine将能够快速检索“蓝色”汽车集,或者能够快速检索“福特”汽车集。(…到目前为止还不错)

但是,如果您试图检索“蓝色”汽车以及由“福特”制造的汽车(即复杂的
和()
查询),则您不再寻找“蓝色”汽车集或“福特”汽车集-您需要这些汽车集的交集

所以在这个场景中,CQEngine会发现没有一个索引可以返回交集。这些指标是次优的

使用次优索引评估查询

为了回答查询,CQEngine将使用来自两个可用索引的统计信息来确定两个子查询中哪一个匹配最少的汽车。也就是说,哪一套更小:“蓝色”汽车,还是“福特”汽车

比如说,这个系列中有100万辆汽车。其中10万辆是蓝色的,9万辆是福特制造的

CQEngine将通过从
制造商
上的索引中检索90K辆“福特”汽车,并对每辆90K汽车进行过滤以确定其是否也是“蓝色”来回答查询

很有可能,该系列中只有5K车是“蓝色”的,并且由“福特”制造。但是,由于这些指标不是回答此类请求的最佳指标,因此将对9万辆汽车进行扫描和过滤

注意:我简化了这个示例,因为在实践中,大多数过滤都是惰性的,并且是避免的,因为应用程序不太可能在一个请求中请求然后迭代数千辆蓝色福特汽车

避免过滤

如果您需要减少查询的延迟,则需要考虑避免上述可能发生的过滤的方法。

因此,在本例中,您可以考虑在a和F上添加一个
compoundex
,而不是两个单独的索引

Query<Pojo> query1 = and(equal(Pojo.A, par1),
                equal(Pojo.F, par2));
select* where A=? and F=?