快速只读嵌入式“数据库”?

时间:2011-12-19 21:32:37

标签: database performance sqlite lookup flat-file

我希望将一些信息分发到不同的计算机,以实现高效且极快的访问,而无需任何网络开销。数据存在于关系模式中,并且需要“加入”实体之间的关系,但根本不需要写入数据库(它将在离线状态下生成)。

我很有信心SQLite会提供性能,但RDMBS似乎不适合基本级别:由于索引查找的成本,连接非常昂贵,而在我的只读上下文中,是不必要的开销,实体可以以文件偏移的形式存储彼此的直接引用。通过这种方式,可以为文件搜索切换索引查找。

我有什么选择?数据库似乎并没有真正描述我正在寻找的东西。我知道Neo4j,但我不能在我的应用程序中嵌入Java。

TIA!

编辑,回答评论:

  • 数据的大小将达到1GB,我使用的是PHP,因此将数据保存在内存中并不是一种选择。我将依赖OS缓冲区缓存来避免不断进入磁盘。
  • 示例是一个包含15个混合类型字段的Product表,以及一个列出具有特定品牌的产品的查询,并在Category表上加入。
  • 解决方案必须是某种平面文件。我想知道是否已经存在一些满足我需求的软件。

@Mark Wilkins:

衡量性能问题。从本质上讲,在我的情况下,使用对SQLite的5ms CPU绑定调用将2ms IO绑定查询替换为Memcache是​​不可接受的...例如,categories表有500条记录,包含父类和子类。以下查询需要大约8毫秒,没有磁盘IO:SELECT 1 FROM类别b.id = a.parent_id上的INNER JOIN类别B.一些更简单,无连接的查询非常快。

2 个答案:

答案 0 :(得分:1)

关于您需要的查询类型,我可能不完全清楚您的目标。但是关于将文件偏移存储到其他数据的部分似乎是一个非常脆弱的解决方案,难以维护和调试。可能有一些工具可以帮助它,但我怀疑你最终会自己编写大部分工具。如果其他人不得不稍后再来调试并找出一个自己开发的文件格式,那将会更有效。

然而,我的第一个想法是想知道所描述的性能问题是在此时估计还是实际测量的。您是否使用关系格式的数据运行测试以查看它实际上有多快?确实,连接几乎总是涉及更多的文件读取(如上所述进行二进制搜索,然后获取相关的记录信息,然后查找该记录)。这可能需要4或5个或更多磁盘操作......首先。但是在类别表(来自OP)中,如果它被普遍命中,它可能最终被缓存。这是我的完整猜测,但在许多情况下,类别的数量相对较少。如果是这种情况,整个类别表及其索引可能会被操作系统保留在内存中,从而导致非常快速的连接。

如果表演确实是一个真正的问题,另一种可能性可能是denormalize the data。在类别示例中,只需复制类别值/名称并将其与每个产品记录一起存储。结果,数据库大小会增加,但您仍然可以使用嵌入式数据库(there are a number of possibilities)。如果明智地完成,它仍然可以很好地维护,并提供通过一次查找/搜索和一次读取来读取完整对象的能力。

答案 1 :(得分:1)

一般来说,您最初可能做的最快的事情就是对数据进行非规范化,从而避免使用JOIN和其他多表查找。

使用SQLite,您当然可以自定义各种事物并根据您的需求进行定制。例如,如果您只通过一个线程访问,内存缓存大小,自定义索引(包括删除许多),自定义构建以禁用不必要的元数据,调试等,请禁用所有静音。

看看以下内容:

这当然是假设您需要一个数据库。