这是对一次数据库作业的深究
首先说一下作业题目要求:
建立一张包含四个字段的表,表名为test
第一列为id,主键,自增。
第二列为col1,随机为Mike,Bob,Jack,Alice,Cathy,Ann,Betty,Cindy,Mary,Jane中的一个
第三列为col2,随机为一个5位字母,字母限制在a-e
第三列为col3,随机为一个1-20之间的整数
按照步骤一中对表的要求插入100万条记录,记录执行的时间
对要插入的数据范围进行一定的预处理
(1)对于col1,创建取值范围数组
随机获取的时候只要调用 col1Values[(int)(Math.random()*10)] 即可。
(2)对于col2,通过递归创建取值范围数组
随机获取的时候只要调用col2Values[(int)(Math.random()*3125)]即可。
(3)对于col3,随机获取的时候只要(int)(Math.random()*20)+1即可。
插入大数据量的数据
(1)首先想到的方法当然是传统的一行一行的插入方法:通过Connection获得Statement,再调用Statement对象的execute函数执行sql语句,插入一行,这样循环100万次即可,但是时间复杂度太高,估计没有个把小时是搞不定的。
(2)然后想到了对sql语句进行预处理,于是很大程度上提高了效率。下面是这部分代码的核心部分。
测试结果如下:
start insert data
end insert data
insert time: 110.215 s
(3)对于上面的结果还是不太满意,于是便开始了探索。
(a)从网上看到一个方法,使用在PreparedStatement 类上的addBatch(),executeBatch()方法,通过批量处理,可以一次性的将1000甚至10000个sql插入操作作为一个事务进行批量优化,并且作者在oracle的数据库上测试过时间是低于10s的。于是我也尝试了一下,发现依然是107s左右,于是便迷茫了。
(b)这个时候看到网上的另外一篇文章,解释了为什么MySql的JDBC驱动不支持批量操作,原来Mysql不支持addBatch(),executeBatch()等方法的批量优化,而Oracle则数据库支持,并且可以在360 ms左右的时间插入100万条记录
网址:http://elf8848.iteye.com/blog/770032
(c)后来看到葛班长的日志,他通过Python在SQLite中插入100万条数据只用了4秒,原因在于Python对所有的这100万条插入语句进行了优化,将所有的插入操作放到了同一个事务中,这样极大的减少了开启和取消事务的时间,而正是这部分操作会消耗大量的时间。
网址:http://aegiryy.net/?p=380
(d)于是我受到了启发,并且了解到对于Mysql数据库的操作时,一个sql插入语句中可以插入多行数据。于是我尝试通过StringBuffer构造一个比较大的sql语句,每个语句可以插入1万行的数据(如果是10万或者100万的话会超出堆内存限制),这样循环100次即可完成插入。下面是这种方法的核心代码:
测试结果如下:
start insert data
end insert data
insert time: 15.083 s
(e)最后我想到了再将这种方法优化,采用预处理的方式,在代码易读性和效率上都有所提高,虽然效率提高的不多。下面是这个方法的核心代码:
测试结果如下:
start insert data
end insert data
insert time: 14.47 s
最后贴出最终个解决方案的所有代码:
分享到:
相关推荐
jsp+servlet+mysql的使用,实现从jsp页面的表单输入数据,到servl进行处理,把数据插入数据库。 你可以学到连接数据库,向数据库插入数据,使用servle等
当获取过来的是值往数据库插入的时候有相同的就不插入,将不同的插入到数据库中
java向数据库插入数据与把数据显示到页面,是用于操作数据库的 保存图片到数据库 获取图片到到页面 CLOB类专用处理:
Qt中操作数据库例子-插入数据 环境:win7,vs2013,Qt5.6.0(32 bit),qt add in 1.2.5 主要用QSqlTableModel实现。
Java向数据库中插入大量数据时的优化
主要用于MFC编程过程中,通过VS中的SQL语句对数据库SQL2005中数据实现添加
JAVA+ACCESS 做数据库插入记录
VC 演示如何使用insert语句批量向数据库插入数据,这个我感觉挺有用处吧,一般情况下,我们录入都是一条一条的,但信息量较大的时候,就需要批量插入数据了,我们可以先读取外部指定格式的文件,然后将数据转换为可...
在ASP.NET中向数据库中插入数据.rar在ASP.NET中向数据库中插入数据.rar
插入数据到数据库,适合初学者
向sql server数据库插入中文时显示乱码
python+Django+mysql实现了连接数据库,动态页面。对于新学习python和有一部分基础的开发者和学员来说非常有帮助,按照步骤一步一步的做即可。
向数据库插入blob数据实例源码.rar 在mysql中通过。
今天在向Sqlite数据库里插入数据的时候,报了这样一个错: 代码如下: “too many terms in compound SELECT” 去Stackoverflow上查了一下,发现有人回答这个问题:链接 原来一次性向数据库里插入数据的条数不能太...
向数据库插入datetime类型的数据 一种是用jsp处理 两种是在sql语句上进行处理
c#连接sqlserver数据库插入数据从数据库获取时间示例共9页.pdf.zip
直接用代码介绍了如何在asp.net中利用ajax向数据库中插入数据
向Oracle数据库插入Clob大段文本解决方法
用java程序怎么实现200ms往数据库中插入10000条数据
主要给大家介绍C#.net中如何批量插入大量数据到数据库中,本文涉及到C#.net中批量插入数据到数据库中方面的内容,对C#.net批量插入数据到数据库中感兴趣的朋友可以参考下本