mysql大批量插入数据的4种方法示例
前言
本文主要给大家介绍了关于mysql大批量插入数据的4种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
方法一:循环插入
这个也是最普通的方式,如果数据量不是很大,可以使用,但是每次都要消耗连接数据库的资源。
大致思维如下
(我这里写伪代码,具体编写可以结合自己的业务逻辑或者框架语法编写)
for($i=1;$i<=100;$i++){ $sql='insert...............'; //querysql } foreach($arras$key=>$value){ $sql='insert...............'; //querysql } while($i<=100){ $sql='insert...............'; //querysql $i++ }
因为太过普通同时也没什么难度同时也不是我今天主要写的所以这里我不多说
方法二:减少连接资源,拼接一条sql
伪代码如下
//这里假设arr的key和数据库字段同步,其实大多数框架中在php操作数据库的时候都是这么设计的 $arr_keys=array_keys($arr); $sql='INSERTINTOtablename('.implode(',',$arr_keys).')values'; $arr_values=array_values($arr); $sql.="('".implode("','",$arr_values)."'),"; $sql=substr($sql,0,-1); //拼接之后大概就是INSERTINTOtablename('username','password')values ('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx') ....... //querysql
这样写正常插入一万条基本问题不大,除非数据很长,应付普通的批量插入够用了,比如:批量生成卡号,批量生成随机码等等。。。
方法三:使用存储过程
这个我手里正好再用这个就把sql付出来,具体业务逻辑大家自己组合一下就可以。
delimiter$$$ createprocedurezqtest() begin declareiintdefault0; seti=0; starttransaction; whilei<80000do //yourinsertsql seti=i+1; endwhile; commit; end $$$ delimiter; callzqtest();
这个也只是个测试代码,具体参数大家自行定义
我这里是一次插入8万条,虽然不多但是,每一条数据量都很大,有很多varchar4000和text字段
耗时6.524s
方法四:使用MYSQLLOCAL_INFILE
这个我目前正在使用,所以顺便把pdo的代码也复上来,以便大家参考
//设置pdo开启MYSQL_ATTR_LOCAL_INFILE /*hs96.cn@gmail.com publicfunctionpdo_local_info() { global$system_dbserver; $dbname='hs96.cn@gmail.com'; $ip='hs96.cn@gmail.com'; $user='hs96.cn@gmail.com'; $pwd='hs96.cn@gmail.com'; $dsn='mysql:dbname='.$dbname.';host='.$ip.';port=3306'; $options=[PDO::MYSQL_ATTR_LOCAL_INFILE=>true]; $db=newPDO($dsn,$user,$pwd,$options); return$db; } //伪代码如下 publicfunctiontest(){ $arr_keys=array_keys($arr); $root_dir=$_SERVER["DOCUMENT_ROOT"].'/'; $my_file=$root_dir."hs96.cn@gmail.com/sql_cache/".$order['OrderNo'].'.sql'; $fhandler=fopen($my_file,'a+'); if($fhandler){ $sql=implode("\t",$arr); $i=1; while($i<=80000) { $i++; fwrite($fhandler,$sql."\r\n"); } $sql="LOADDATAlocalINFILE'".$myFile."'INTOTABLE"; $sql.="tablename(".implode(',',$arr_keys).")"; $pdo=$this->pdo_local_info(); $res=$pdo->exec($sql); if(!$res){ //TODO插入失败 } @unlink($my_file); } }
这个同样每一条数据量都很大,有很多varchar4000和text字段
耗时2.160s
以上满足基本需求,100万数据问题不大,要不数据实在太大也涉及分库分表了,或者使用队列插入了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。