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