【问题标题】:Fast read-only embedded "database"?快速只读嵌入式“数据库”?
【发布时间】:2011-12-19 21:32:36
【问题描述】:

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

我对 SQLite 能够提供性能非常有信心,但 RDMBS 似乎从根本上不适合:由于索引查找的成本,连接非常昂贵,而且在我的只读上下文中,这是不必要的开销,其中实体可以以文件偏移量的形式存储彼此的直接引用。这样,索引查找切换为文件查找。

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

TIA!

编辑,回答 cmets:

  • 数据最大为 1gb,而且我使用的是 PHP,因此将数据保存在内存中并不是一个真正的选择。我将依靠操作系统缓冲区缓存来避免不断地访问磁盘。
  • 示例是包含 15 个混合类型字段的 Product 表,以及用于列出具有特定品牌的产品的查询,并加入 Category 表。
  • 解决方案必须是某种平面文件。我想知道是否已经有一些软件可以满足我的需求。

@马克威尔金斯:

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

【问题讨论】:

  • 你是说这是一个关系模式,你需要加入关系,但你不想使用关系数据库?为什么不使用平面文件?
  • 举例说明你的“数据库”的大小。

标签: database performance sqlite lookup flat-file


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    看看以下内容:

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

    【讨论】:

    • 非规范化不是一个选项,因为它会增加数据的大小。
    • 即使不能选择去规范化,我也会重新查看列出的要点项目(不过,我不会完全打折,因为您可能能够去-规范化次要数据点并以很少的额外空间成本获得主要的速度提升)。根据您的需要定制 SQLite 构建 + pragma 设置等。使用 EXPLAIN 剖析所有查询并对其进行调整以提高速度 + 使用查询计划器。
    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2012-01-09
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多