mysql怎么批量錄入數(shù)據(jù)

mysql批量錄入數(shù)據(jù)的方法:1、使用循環(huán)插入;2、減少連接資源,拼接一條sql;3、使用存儲(chǔ)過(guò)程;4、使用【MYSQL LOCAL_INFILE】。

mysql怎么批量錄入數(shù)據(jù)

本教程操作環(huán)境:windows7系統(tǒng)、mysql8.0.22版,DELL G3電腦,該方法適用于所有品牌電腦。

相關(guān)免費(fèi)學(xué)習(xí)推薦:mysql視頻教程

mysql批量錄入數(shù)據(jù)的方法:

方法一:循環(huán)插入

這個(gè)也是最普通的方式,如果數(shù)據(jù)量不是很大,可以使用,但是每次都要消耗連接數(shù)據(jù)庫(kù)的資源。

大致思維如下

(我這里寫(xiě)偽代碼,具體編寫(xiě)可以結(jié)合自己的業(yè)務(wù)邏輯或者框架語(yǔ)法編寫(xiě))

for($i=1;$i?$value){ $sql?=?'insert...............'; ?//querysql } while($i?<p>因?yàn)樘^(guò)普通同時(shí)也沒(méi)什么難度同時(shí)也不是我今天主要寫(xiě)的所以這里我不多說(shuō)</p><p><strong>方法二:減少連接資源,拼接一條sql</strong></p><p>偽代碼如下</p><pre class="brush:php;toolbar:false">//這里假設(shè)arr的key和數(shù)據(jù)庫(kù)字段同步,其實(shí)大多數(shù)框架中在php操作數(shù)據(jù)庫(kù)的時(shí)候都是這么設(shè)計(jì)的 $arr_keys??=?array_keys($arr); $sql????=?'INSERT?INTO?tablename?('?.?implode(','?,$arr_keys)?.?')?values'; $arr_values??=?array_values($arr); $sql????.=?"?('"?.?implode("','"?,$arr_values)?.?"'),"; $sql????=?substr($sql?,0?,-1); //拼接之后大概就是?INSERT?INTO?tablename?('username','password')?values ('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx') ....... //querysql

這樣寫(xiě)正常插入一萬(wàn)條基本問(wèn)題不大,除非數(shù)據(jù)很長(zhǎng),應(yīng)付普通的批量插入夠用了,比如:批量生成卡號(hào),批量生成隨機(jī)碼等等。。。

方法三:使用存儲(chǔ)過(guò)程

這個(gè)我手里正好再用這個(gè)就把sql付出來(lái),具體業(yè)務(wù)邏輯大家自己組合一下就可以。

delimiter?$$$ create?procedure?zqtest() begin declare?i?int?default?0; set?i=0; start?transaction; while?i<p>這個(gè)也只是個(gè)測(cè)試代碼,具體參數(shù)大家自行定義</p><p>我這里是一次插入8萬(wàn)條,雖然不多但是,每一條數(shù)據(jù)量都很大,有很多varchar4000 和text字段</p><p>耗時(shí) 6.524s</p><p><strong>方法四:使用MYSQL LOCAL_INFILE</strong></p><p>這個(gè)我目前正在使用,所以順便把pdo的代碼也復(fù)上來(lái),以便大家參考</p><pre class="brush:php;toolbar:false">//設(shè)置pdo開(kāi)啟MYSQL_ATTR_LOCAL_INFILE /*hs96.cn@gmail.com public?function?pdo_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?=&gt;?true]; ??$db??=?new?PDO($dsn?,$user?,$pwd?,$options); ??return?$db; ?} //偽代碼如下 public?function?test(){ ??$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?pdo_local_info?(); ???$res?=?$pdo-&gt;exec($sql); ???if?(!$res)?{ ????//TODO?插入失敗 ???} ???@unlink($my_file); ??} }

這個(gè)同樣每一條數(shù)據(jù)量都很大,有很多varchar4000 和text字段

耗時(shí) 2.160s

以上滿足基本需求,100萬(wàn)數(shù)據(jù)問(wèn)題不大,要不數(shù)據(jù)實(shí)在太大也涉及分庫(kù)分表了,或者使用隊(duì)列插入了。

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員