我有一个CSV文件test.csv
,其中有很多类型为(text,int,int)
的唯一记录,其中文本字段不超过70个字符。
执行以下语句时,速度通常约为80 MiB / s:
sqlite3 db 'create table test(a text,b int,c int,primary key(a,b,c) without rowid'
pv test.csv | sqlite3 -init <(echo -e '.mode csv\n.import /dev/stdin test') db
但是再次执行以下语句时,速度通常低于100 KiB / s,并且许多UNIQUE constraint failed
会打印到stderr:
pv test.csv | sqlite3 -init <(echo -e '.mode csv\n.import /dev/stdin test') db
在我看来,在两种情况下,SQLite都需要检查相同的约束,因此,什么都没有写到磁盘的情况要比将所有内容都写到磁盘的情况慢得多?磁盘?
最重要的问题-如何使次要导入更快?该数据库需要每天进行更新,并且记录大多是新的,但是其中一些记录已经存在于数据库中。这会使导入处理变慢。
顺便说一句,SSD和HHD的情况相同,尽管SSD的速度要快一些。