数据库插入操作性能提升问题
程序简写为
while()
{
A:计算;
B:向数据库插入数据(PS.一般累加到1W条数据库的时候一起插入)
}
总共记录有700W+,耗时10个小时,如果去掉B,只进行计算,大概需要2分多钟;
之所以用数据库是因为这些结果数据需要被查询,但是瓶颈显然是在数据库插入操作,10个小时还是太慢了。
如果我想改进,有没有什么办法呢??
如果我将计算的数据写在文件里,同时开启100个线程进行写文件操作,是不是能快点呢?但是如果写在文件里面的话查询就费事了,可以用Lucene做查询吧?
——————————————————————————————————————————————————————————————————————————————
听下面几位讨论过后,感觉改进的地方在数据库优化这一块,700W+条数据大概也就3G吧,普通的复制操作的话几分钟就好了,但是insert into 插入操作怎么优化呢。。sqlserver2008数据库
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
答案:
我是这样理解你的问题:
1. 为什么要写入数据库,因为计算结果需要给人查询,所以不能放在文件里
2. 慢在哪里,计算只要2分钟,慢在数据库写入上
3. 计算只要2分钟,说明你的计算,不依赖上一步计算并写入数据库的数据。也就是说你的计算程序不需要查询你刚刚写入的数据
【写入文件】、【使用lucene专门做查询】的解决方案都太重量级了,700万也不是太大的数据,我上面的两条措施只是运维层面的改动,不需要修改你的程序,就可以把时间缩短到0.5-2小时。还有,才2分钟的计算量,也不用考虑分布式和并行计算。
除非你有 100 个硬盘,不然多线程同时写只会更慢(因为增加了硬盘操作中最耗时的部分——寻道)。
你的数据库配置和结构设计可能存在问题。
换块SSD可能是可行方案。。 话说大多数网站的瓶颈都是卡在SQL上吧0.0
700W+ 数据也不算多, 插入需要10个小时, 不说你的 程序有什么问题, 但是效率肯定是可以提高的.
一般 向数据库 导入导出, 数据库都会提供相应的工具. 比如mysql的:
http://dev.mysql.com/doc/refman/5.1/en/load-data.html
先prepare一个insert statement,然后后面都用execute statement,比每次都insert快得多