2014-11-25 103 views
0

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

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

编辑:更具体: 比方说,我的记录是具有以下字段交易:

时间戳,类型,发件人收件人,量,消息

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

回答

0

指数有自己的头顶。如果你有一个表,你会有很多插入,我建议避免索引,因为它有散列的头顶。

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

您可以创建一个唯一的键约束(这里它将是所有这3列中的组合键),让我知道需求,也许我们可以给你一个更简单的方法做一个更好的解决方案: )

Danyal

+0

我用更具体的例子更新了我的问题。 – user3528637 2014-11-25 13:15:02

0

人,这可能不是查询所有记录,检查它们的副本,然后插入新行:)的好办法。只要您继续前进,随着记录数量的增加,开销将增加。

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

创建唯一索引后,将不允许插入任何重复记录。它非常安全和安全。

+0

感谢您的评论。似乎我必须详细说明一点: – user3528637 2014-11-25 14:05:47

+0

当我得到一个新的交易时,它不应该立即插入表中。相反,应该检查它是否是新的,并且如果是这种情况发送给其他感兴趣的方。经过一段时间后,将一批新事务插入到数据库中。 – user3528637 2014-11-25 14:12:42

+0

我理解它,但这将是一个非常巨大的操作,我猜,做一个立即插入和捕捉异常将更快,更可行这里,而不是加载所有的记录,然后在应用层执行计算.. – 2014-11-25 14:14:57

0

索引随机分布的数据对性能不利。一旦索引中的条目多于缓存中的条目,那么更新索引就会变得非常慢,特别是在使用硬盘时。这是因为在硬盘上查找速度非常慢。这与数据的随机分布相结合将导致非常差的性能。使用固态硬盘会更好一些,因为随机存取读取速度更快。

+0

其实我不会在查看资源管理器时看不到任何读取,只有大量的写入。这只是H2数据库的一个问题,或者**所有**数据库共享的一个片状问题?有数据库包含数以百万计的散列,他们如何搜索给定的散列? – user3528637 2014-11-26 10:03:02

+0

他们通常试图保留所有的哈希值在内存中。否则,基本上每次访问都会导致至少一次磁盘读操作,因为没有散列的地方。至于写入,理论上可以通过使用日志结构化存储来减少它们;但H2尚未针对这种情况进行优化(除了在添加数据后创建索引时,这种情况应该没问题)。无论如何,我会避免索引随机分布的数据。 – 2014-11-26 10:59:35

+0

更新:我将H2从1.3.175转换为1.4.182。这解决了这个问题,在硬盘活动较低的情况下,插入新行的速度更快。 – user3528637 2014-11-26 11:18:51