因为自己曾写过一个新浪微博爬虫,使用的是Mysql数据库,爬虫经常需要往数据库中一次性存入千条或者万条数据,因此插入速度是一个很关键的点。因此在网上搜了下能够改进批量插入速度的方法,偶然看到可以使用PreparedStatement代替Statement,基本原理就是PreparedStatement可以利用到数据库的预编译功能,当结构相同的sql语句频繁被重复使用时,PreparedStatement可以提高插入效率。我做了一个小实验,就是分别使用它们往数据库中插入大量数据,比较了一下插入速度。
上面这个表基本能模拟我的爬虫的行为,我爬取的新浪微博用户微博数通常都在几百到几千条(也有的用户能达到几w条),每次运行能爬几百个用户。以每次1000,存100次为例,使用PreparedStatement至少可以为我节省10倍的插入时间,提高幅度已经不小了。
每次插入条数 | 插入次数 | Statement | PreparedStatment |
500 | 20 | 0.87 | 1.22 |
500 | 50 | 5.17 | 2.56 |
500 | 100 | 21.35 | 4.7 |
1000 | 20 | 3.28 | 2.12 |
1000 | 50 | 21.22 | 4.73 |
1000 | 100 | 90.06 | 9.25 |
PS:后来我又做了一个二者的select的速度比较,从一个4400w条的表中,连续取100个用户的100条微博,发现二者速度都在30秒左右。可见至少在我的应用情况下,PreparedStatement并不能为连续读操作提高速度,但却可以大幅度提高连续写速度。