从我试图解决的问题开始:
我查看了一些内存数据库,如H2和VoltDB,但SQL开销主导了搜索,即使使用PreparedStatements也是如此。不可变Object [] []的全表扫描可以解决一个问题,但会在表中留下很多优化(比如索引)。如果我开始构建索引和marge-sets,感觉就像是在重新发明数据库。
对可以处理此问题的现有开源库或数据结构的任何建议?或者我最好继续我在这里发明的""接近并开始滚动我自己的索引?对于我在这里发明的""方法,我使用Object [] []获取数据并对其进行编码(使用Akka并行高达1000x):
public int[] findMatchingRows(int[] columnIndex, Object[] columnValues){
List<Integer> matchingRows = new ArrayList<Integer>();
for(int row=0;i<data.length; row++){
boolean found = true;
for(int colIdx=0;j<columnIndex;colIdx++){
if(!matches(data[row][columnIndex[colIdx], columnValues[colIdx]){
found = false;
break;
}
}
if(found){
matchingRows.add(row);
}
}
return matchingRows;
}
答案 0 :(得分:0)
一个简单的手动方法是,对于每个“索引”列,将所有行放入HashMap<ColumnType, HashSet<Row>>
,以便每个不同的键值映射到具有该键值的所有行的列表中柱。可以通过获取查询中的键值的所有HashSet<Row>
并获取它们的交集来执行查询。
此预期时间复杂度为 O(km),其中 k 是查询中的键数, m 是来自任何键列的最大命中数。