免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5187 | 回复: 5
打印 上一主题 下一主题

perl高效向mysql插入海量数据有什么好的方法么? [复制链接]

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-27 10:20 |只看该作者 |倒序浏览
perl高效向mysql插入海量数据有什么好的方法么?除了存储过程

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
2 [报告]
发表于 2013-08-27 11:13 |只看该作者
不懂,帮顶,

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
3 [报告]
发表于 2013-08-27 11:25 |只看该作者
http://news.ccidnet.com/art/32849/20100420/2039433_1.html
perl生成文本,然后用LOAD DATA

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
4 [报告]
发表于 2013-08-27 14:36 |只看该作者
多谢啦 回复 3# laputa73


   

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
5 [报告]
发表于 2013-08-27 15:11 |只看该作者
本帖最后由 grshrd49 于 2013-08-27 15:12 编辑

自己写个...看....
100000条数据一次插入5000条
用时34秒

  1. use DBI;
  2. use strict;

  3. #my @uhomedb_test = ("dbname","ip","post","用户名","密码");
  4. my @uhomedb_test = ("uhomedb_test","xx.xx.xx.xx","3306","uhomer","uhome");
  5. my $dbh;
  6. $dbh = &connection(@uhomedb_test);

  7. my ($datatotal,$d);
  8. $d = $datatotal = 5000;                #设置每次插入的记录总数
  9. my $total = 100000;                        #循环最大值
  10. my $datastring;
  11. for(1..$total){
  12.         my $uname = "\'yangxm".$_."\'";
  13.         my $passwd = "\'11111111\'";
  14.         #my $xx = xx;
  15.         #这里可以添加字段,添加后要放到@dataele数组中,并在$sql1的sql语句中添加字段名称
  16.        
  17.         my @dataele = ($uname,$passwd);
  18.         $datatotal = 1 if($_ == $total);
  19.         ($datastring, $datatotal) = &insertdata(\@dataele,$datastring,$datatotal);
  20.         if(!$datatotal || ($_ == $total)){
  21.                 my $sql1 = "INSERT INTO uhomedb_test.yxm_test (username,password) VALUES $datastring;";
  22.                 print "$_\n";
  23.                 #print "$sql1\n";
  24.                 &operate_mysql($dbh,"$sql1","insert");
  25.         }
  26.         next if($datatotal);
  27.        
  28.         $datatotal = $d;        #还原数据总量
  29.         $datastring = "";        #清空数据串

  30. }



  31. #以下是工具函数,连接数据库、等...

  32. sub insertdata
  33. {
  34.         my ($datatemp,$datastring,$datatotal) = @_;
  35.         my @dataele = @$datatemp;
  36.         $datastring = $datastring . "(";
  37.         foreach(my $i=0; $i<=$#dataele; $i++){
  38.                 $datastring = $datastring . $dataele[$i];
  39.                 $datastring = $datastring . "," if($i < $#dataele);
  40.         }
  41.         $datastring = $datastring . ")";
  42.         $datatotal--;
  43.         #$datastring = $datastring . ",";
  44.         $datastring = $datastring . "," if($datatotal);
  45.        
  46.         return ($datastring , $datatotal);
  47. }

  48. sub connection
  49. {       
  50.         #@uhomedb_test = ("uhomedb_test","116.228.70.232","3306","uhomer","uhome");
  51.         my ($dbname,$location,$port,$db_user,$db_pass);
  52.         my ($database,$dbh);
  53.         ($dbname,$location,$port,$db_user,$db_pass) = @_;
  54.         $database = "DBI:mysql:$dbname:$location:$port";
  55.         return $dbh = DBI->connect($database,$db_user,$db_pass);
  56. }

  57. sub operate_mysql
  58. {
  59.         #&operate_mysql($dbh,"$sql_word","select|insert");
  60.         my ($dbh,$sql_word,$control);
  61.         ($dbh,$sql_word,$control) = @_;


  62.         if ( $control eq "select" ){
  63.                 my $sth = $dbh -> prepare($sql_word);
  64.                 $sth -> execute() or print $dbh->errstr;
  65.                 my @result ;
  66.                 while (my @value = $sth -> fetchrow_array){
  67.                         push @result, @value;
  68.                         #print "value : @value\n";
  69.                 }
  70.                 return @result;
  71.         }
  72.         if ( $control eq "insert" ){
  73.                 my $sth = $dbh -> prepare($sql_word);
  74.                 $sth -> execute() or print $dbh->errstr;
  75.         }
  76. }
复制代码
这是表结构

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
6 [报告]
发表于 2013-08-27 15:53 |只看该作者
多谢啦 回复 5# grshrd49


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP