2015-04-06 45 views
1

的问题开始我试图解决:在内存单表数据库算法或文库

  • 给定一个单一的平台状结构与短小长度的数据(行和列) (少超过50,000行)
  • 我需要使用精确的相等匹配来快速找到匹配的行,给定列索引数组 。 (典型地2-3列将是 涉及与给定查询)
  • 最多对数据1000次的查询都必须内 1秒
  • 数据完成可以附加到或分批异步更新该
    将揭开序幕查询再次
  • 查询可以(和理想应该)并行
  • 数据运行,而查询是基于正在运行
  • Java是不可改变

我看了一些像H2和VoltDB这样的内存数据库,但SQL开销占据了搜索的主导地位,即使使用PreparedStatements。不可变对象[] []的完整表扫描工作到一个点,但离开表的许多优化(如索引)。如果我开始构建索引和marge-sets,那感觉就像我正在重新创建数据库。

对现有的开源库或数据结构有哪些建议可以处理?或者我最好继续我的“在这里发明”的方法,并开始滚动我自己的索引?对于我的“在这里发明”的方法,我使用的对象[] []的数据和编码它像(最多并行使用阿卡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; 
} 
+1

听起来像H2,德比或其他内存数据库是最好的选择。只要确保你正确地创建索引。另一种方法是在每一列都有一个“TreeMap”或者“HashMap”,这样你就可以搜索给定的值,但是复杂性可能过大,维护和理解代码的代价可能太高,获得。 –

回答

0

一个简单的手卷的做法是,对于每个“索引”列,将所有行放入一个HashMap<ColumnType, HashSet<Row>>,以便每个不同的键值映射到该列中具有该键值的所有行的列表。查询可以通过获取查询中关键值的所有HashSet<Row>并执行它们的交集来执行。

这样做的预期时间复杂性将是O(公里),其中ķ是在查询和密钥的数量是从任何键列命中的最大数目。