0

我有一个只有一个表(大约 50,000 行)的 sqlite 数据库,我经常使用 Java 和 sqlitejdbc 对其执行更新 - 否则 - 插入操作(即,如果行存在,我会尝试更新行,否则插入新行)。我的表类似于带有“word”和“frequency”列的词频表,并且没有主键!

问题是我执行了数十万次更新否则插入操作,平均插入或更新操作需要超过 2 毫秒。甚至有时插入操作需要大约 20 毫秒。我还应该提到,该表在我在插入操作中使用“where”子句的列(“word”列)上有一个索引,这自然会使插入操作更加昂贵。

首先,我想确保对具有 50,000 行的索引表进行插入操作的 2 毫秒是否正常,并且我没有遗漏任何内容,之后任何提高性能的建议都非常受欢迎。让我感到震惊的是,在执行大量插入操作之前删除索引并在之后重新创建它是一种很好的做法,但我不能在这里这样做,因为我需要检查是否已经存在具有相同单词的行。

我知道所有关于“它取决于硬件”和“它取决于你的代码的其余部分”等的东西,但我真的认为人们可以知道插入操作在普通电脑上应该花费多少。

4

1 回答 1

0

我部分解决了我的问题。对于对此问题的答案感兴趣的任何人,链接都会有所帮助。简而言之,关闭 sqlite 中的日志模式(“pragma journal_mode=OFF”)显着提高了插入性能(在我的情况下几乎是以前速度的四倍),但代价是在意外关闭时使代码容易丢失数据。

至于正常的插入速度,它比 2ms/操作快得多。使用正确的 pragma 指令、充分利用事务等,它可以达到每秒数十万次插入操作。

于 2012-08-21T15:24:29.100 回答