昨天写了一个将 5000 万行数据导入 sqlite 的程序。
?
就是简单的 key, value 型数据,key 为定长字符串,同时以此列为主键,建立索引。
?
最初的做法是,直接插入单表,每一万行数据为一个事务。用了一个晚上,大概 10 个小时,只插入了 2500万行。只完成了一半。最初的10万行数据,每一万行插入耗时都在1秒内。随着表内的数据增多,插入速度越来越慢,到 400万行时,每一万行数据插入耗时已经接近 20 秒。。。
?
翻看了 sqlite 官网的 FAQ,有这样的描述,大概意思是:?
在非单行事务的情况下,sqlite 在普通 PC 上能轻松达到 5 万行每秒的插入速度; 而在单行事务的情况下,7200转的硬盘只能达到 6 条每秒(因为要保证事务性,磁头就需要来回切换写入数据)。
?
所以,这里插入慢的原因应该是建立索引的耗时。
?
由于这些数据里有重复数据,所以不方便采用先插入数据,后建立索引的方式。只能进行分表,以减小表的规模。于是,分为 256 个表,以 key 的头两个字母做散列。只用了不到半个小时就插入完毕。
?
需要注意的是,尽量控制每个分表的每次插入数据在 1 万行以上,减少事务的耗时。
1 楼 Zhongwei_leg 2011-07-18
万行 秒数
13 1
37 2
100 4
150 6
215 10
450 20
13 1
37 2
100 4
150 6
215 10
450 20
2 楼 一块可怜的牛皮糖 2011-08-25
把数据分成256个表,然后对key的前两个字符建立散列么?
3 楼 Zhongwei_leg 2011-08-30
一块可怜的牛皮糖 写道
把数据分成256个表,然后对key的前两个字符建立散列么?
是的