大量数据导入数据库问题总结(成也索引,败也索引)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 大量数据导入数据库问题总结(成也索引,败也索引)

大量数据导入数据库问题总结(成也索引,败也索引)

 2011/11/24 10:44:23  lwjlaser  http://lwjlaser.iteye.com  我要评论(0)
  • 摘要:老板项目需要从类似日志的文本文件中提取出元数据,然后放到数据库中为数据挖掘做处理。设计数据库为两张表,初步估计第一张表是千万级的数据,第二张表是亿级数据。面对这么大数据量的导入需求,分析设计高效的程序就显得很有必要了,磨刀不误砍柴功嘛!首先考虑的是提高IO效率,毕竟现在计算机cpu高主频,多核心的环境下硬盘IO才是瓶颈。在文件读取上提高程序效率,比如用StringBuilder代替“+”等。其次是提高内容分析的效率,在设计内容分析程序的时候就得为大数据量和多线程考虑。1.减少复杂操作
  • 标签:总结 索引 问题 数据库 数据 导入数据
老板项目需要从类似日志的文本文件中提取出元数据,然后放到数据库中为数据挖掘做处理。设计数据库为两张表,初步估计第一张表是千万级的数据,第二张表是亿级数据。面对这么大数据量的导入需求,分析设计高效的程序就显得很有必要了,磨刀不误砍柴功嘛!
首先考虑的是提高IO效率,毕竟现在计算机cpu高主频,多核心的环境下硬盘IO才是瓶颈。在文件读取上提高程序效率,比如用StringBuilder代替“+”等。
其次是提高内容分析的效率,在设计内容分析程序的时候就得为大数据量和多线程考虑。1.减少复杂操作,比如提取文本文件少用正则表达式匹配,尽量定位下标,利用下标截取字符串;还有减少循环次数,尽量减少循环次数,毕竟是有上亿条数据,多一次单层循环最少就多计算若干亿次。2.程序少用或不用共享数据,例如处理类中没有类属性,这样能简化多线程程序难度。3.合理设计减少除了插入之外的其他与数据库交互行为。
最后是数据库插入程序。利用jdbc支持的批量插入,手动控制事务。这样优化的程序能达到多线讲程并发高效插入。
最后是记录下教训。因为数据是为数据挖掘准备的,在处理过程中需要频繁查询大量字段,所以数据库设计了对应的索引,索引可以极大的提高查询效率。本来为了查询方便的索引没想到确成了程序的噩梦。程序刚开始运行的时候速度就没有想象中的理想,随着程序运行,效果越来越差,效率奇低,每秒仅10条左右的速度,这到猴年马月才能导完啊!于是分析程序,开始考虑是内容提取程序的问题,原来用的是java调用C程序的动态链接库,觉得可能会有效率问题,于是用java重写原来的内容提取部分程序,单元测试效率不错。没想到整体程序还是奇慢,没多少行的代码手动检查了N遍。最后才怀疑到了数据库索引的问题,毕竟mysql索引用的是B+树,频繁插入会不断更改树的结构,这很影响效率,而且会打断批量插入的效果,于是走头无路的情况下试着删除了索引,发现速度一下就上来了。没想到当初自以为聪明设置的几条索引,让自己用了好几天的时间找bug。真是“成也索引败也索引”。大数据量导入正确的做法应该先导删除索引,待数据导完后再创建索引。
发表评论
用户名: 匿名