我有一个带有单个表的SQLite数据库,用于存储Apache HTTP日志。
我使用Python脚本导入Apache日志文本文件,该脚本在插入之前将时间戳转换为unix-epoch整数。
为了防止存储重复的行,我可以使用所有列创建唯一约束,或者我可以添加一个哈希列来存储该行的MD5。
所以我尝试了第一个想法 - 将所有列设置为唯一,这样可行,但它确实使DB文件相当大。
我首选的解决方案是使用MD5哈希列。但是当我这样做时,插入似乎变得越来越慢。
仅供参考我测试的数据集是超过800万行。
非常奇怪的事情(对我来说很奇怪)是,如果我在unix_epoch_timestamp和md5_hash上创建一个唯一约束,那么插入内容就不会显着减慢。
所以我为我的问题找到了解决办法!但我对引起这种情况的原因很感兴趣。
我在Ubuntu 14.04上使用SQLite 3.8.2,使用旧的Core-i5和4GB RAM。
有800万行:
UNIQUE(unix_epoch_timestamp,md5_hash)ON CONFLICT FAIL需要约。 15分钟导入。
UNIQUE(md5_hash)ON CONFLICT FAIL需要很长时间!我从未将它运行到最后,但我看不到它不到一个小时。
更新: 简要总结 - SQLite DB使用Python脚本从一个按时间顺序排序的Apache日志文件中插入一个超过800万行的单个表。 Python脚本大约每10K行提交一次。
epoch + md5的UNIQUE约束: 插入总时间:13分12秒。 最后的.db文件大小为3.3GB。
对md5的UNIQUE约束: 插入总时间:148分钟。 最后的.db文件大小为3.2GB。
Python脚本在提交时写出了完成的日志文件的大致百分比。使用UNIQUE(epoch,md5),每个百分比增加之间的时间似乎是恒定的,而UNIQUE(md5)时间似乎增加。