【问题标题】:H2: Insert is slow because of index on columnH2:由于列上的索引,插入速度很慢
【发布时间】:2014-11-25 12:45:02
【问题描述】:

我正在使用 h2 数据库来存储数据。 每条记录在数据库中都必须是唯一的(在时间戳、名称、消息的组合......不会在表中出现两次的意义上是唯一的)。因此,表中的一列是记录中数据的哈希值。如果记录已经存在,为了加快搜索速度,我在哈希列上创建了一个索引。确实搜索具有给定哈希的记录非常快。 但问题是:虽然在开始插入 10k 条记录时足够快(大约需要一秒钟),但当数据库中已经有 100 万条记录时(需要一分钟),它会变得非常慢。这可能是因为新的哈希需要集成到现有的索引 b-tree 中。

有没有什么方法可以加快速度,或者有更好的方法来确保表中数据记录的唯一性?

编辑:更具体地说: 假设我的记录是具有以下字段的交易:

时间戳、类型、发件人收件人、金额、消息

一个事务应该只在表中出现一次,所以在插入一个新事务之前,我必须检查该事务是否已经在表中。由于所有字段的 sha 256 散列是唯一的,我的想法是在放置字段散列的表中添加一个“散列”列。在插入新记录之前,我计算字段的散列并查询表哈希。

【问题讨论】:

    标签: hash indexing h2


    【解决方案1】:

    索引有它自己的开销。如果你有一个表,你将有很多插入,我建议避免在它上面建立索引,因为它有哈希开销。

    我可以知道你的意思是什么-->表中的一列是记录中数据的哈希??

    您可以创建一个唯一键约束(这里它将是所有提到的 3 列的复合键),让我知道要求,也许我们可以为您提供更好的解决方案,以更简单的方式实现它:)

    丹妮尔

    【讨论】:

      【解决方案2】:

      伙计,这可能不是查询所有记录、检查它们是否重复然后插入新行的好方法:)。只要您继续前进,开销就会随着记录数的增加而增加。

      在这些字段的组合上创建一个唯一的键约束(检查http://www.h2database.com/html/grammar.html),您不需要计算哈希,数据库将处理哈希的事情。只需尝试添加重复记录,您将得到异常,捕获异常并将错误消息显示为重复插入..

      一旦您创建了唯一索引,它将不允许您插入任何重复记录。这是非常安全和安全的。

      【讨论】:

      • 感谢您的评论。看来我得详细说明一下:
      • 当我得到一个新事务时,它不应该立即插入到表中。相反,应该检查它是否是新的,如果是的话,它会被发送给其他相关方。一定时间后,一批新事务被插入到数据库中。
      • 我理解,但这将是一个非常庞大的操作,我猜,在这里立即插入并捕获异常会更快更可行,而不是加载所有记录然后在应用程序上执行计算层..
      【解决方案3】:

      索引随机分布的数据不利于性能。一旦索引中的条目多于缓存中的条目,则更新索引将变得非常慢,尤其是在使用硬盘时。这是因为硬盘上的寻道速度非常慢。这与数据的随机分布相结合,将导致非常糟糕的性能。使用固态磁盘会好一些,因为那里的随机访问读取速度更快。

      【讨论】:

      • 实际上,在查看资源管理器时,我看不到任何读取,只有大量写入。这只是 H2 数据库的问题还是 所有 数据库共享的一般问题?有些数据库包含数百万个哈希值,它们如何搜索给定的哈希值?
      • 他们通常会尝试将所有哈希值保存在内存中。否则,基本上每次访问都会导致至少一个磁盘读取操作,因为没有散列的局部性。至于写入,理论上可以通过使用日志结构化存储来减少它们;但 H2 尚未针对这种情况进行优化(添加数据后创建索引时除外;这种情况应该可以)。无论如何,我都会避免索引随机分布的数据。
      • 更新:我将 H2 从 1.3.175 切换到 1.4.182。这解决了问题,插入新行的速度要快很多,而硬盘活动较少。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多