【问题标题】:Is Firebird 2.1 efficient to store a massive number of rows in some DB's table?Firebird 2.1 在某些数据库表中存储大量行是否有效?
【发布时间】:2011-11-17 10:21:28
【问题描述】:

我的应用程序不断收到一个需要存储的非常小的事件,我在想这是处理它的最佳方式。这个事件的表格应该是这样的:

EVENT
id
timestamp
some_data (integer)
fk_to_some_holder_table

如果我继续将每个事件存储为一行,那么对于使用某种 blob 压缩/处理的实现会不会有一些缺点?还是我在这里太过分了?

我使用的是 Firebird 2.1。如果需要,我可以升级到 Firebird 2.5。

提前致谢。

【问题讨论】:

  • 你的问题不是很清楚。数据库旨在存储大量数据,您提供的定义绝对不需要使用 blob 或压缩,并且不必要地使用它们中的任何一个都会增加完全不必要的开销。你能澄清一下你在问什么吗?
  • 你的做法是正确的。数据库系统专为存储大量行而设计。不要担心压缩,你会浪费你的时间。并且在任何情况下都不要错误地尝试使用 blob!
  • 你是对的。我的问题是关于 Firebird 2.1 实现的。我编辑了这个问题。谢谢
  • 当我第一次在我目前的工作中接管数据库时,它最初设置了一些字段作为 BLOBS,你必须做的只是回显 blob(在 php 中)是荒谬的,所以我切换了它们都只是普通的行,没有任何人注意到的区别,而且我们数据库中的一些表有 600,000 + 行。

标签: database database-design firebird firebird2.1


【解决方案1】:

我相信你最好使用“传统的基于行的记录”:

  • 您想查询记录,对吗?查询 BLOB 既困难又缓慢;
  • 由于您的记录太小,您无法对其进行压缩,因此使用大多数压缩算法,结果可能会比单独字段所需的大;

根据“What are the technical limits of Firebird?”文章,一张表的最大大小为 32TB 或 16G 行。

在这种特定情况下,我认为 2.1 和 2.5 之间没有任何区别,但由于其他/一般改进,我会使用 2.5。

【讨论】:

  • 但是如果我得到很多小记录,我可以把它们放在一个 BLOB 中并压缩那个 BLOB。我会做一些测试并在这里发布结果。
  • 好吧,看起来你只是喜欢它带来的额外作品用我答案中的数字进行一些计算 - 担心空间是否有意义,你得到这么多记录有没有达到极限的危险?假设 idfk_to_some_holder_table 是 64 位整数,您的记录是 224 位或 28 字节。所以 32TB / 28 = 1.1T 行,即行限制更重要。但是,如果您每秒获得 1 行,那么 16G 行适用于 16G / 86400 = 185185 天或大约 500 年。
  • @haole AFAIK,Firebird 在存储数据时在内部使用 RLE 压缩。它可能和一些在外部做的一样有效,值得注意的是一些压缩已经完成。
【解决方案2】:

由于已经提到的原因,作为一行存储比 blob 更有意义

我现在坚持使用 2.1,2.5 有太多我喜欢的错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2011-07-25
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多