共計 2419 個字符,預計需要花費 7 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章主要介紹了 mysql 批量錄入數(shù)據(jù)的方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
mysql 批量錄入數(shù)據(jù)的方法:1、使用循環(huán)插入;2、減少連接資源,拼接一條 sql;3、使用存儲過程;4、使用【MYSQL LOCAL_INFILE】。
mysql 批量錄入數(shù)據(jù)的方法:
方法一:循環(huán)插入
這個也是最普通的方式,如果數(shù)據(jù)量不是很大,可以使用,但是每次都要消耗連接數(shù)據(jù)庫的資源。
大致思維如下
(我這里寫偽代碼,具體編寫可以結合自己的業(yè)務邏輯或者框架語法編寫)
for($i=1;$i =100;$i++){
$sql = insert...............
//querysql
foreach($arr as $key = $value){
$sql = insert...............
//querysql
while($i = 100){
$sql = insert...............
//querysql
$i++
}
因為太過普通同時也沒什么難度同時也不是我今天主要寫的所以這里我不多說
方法二:減少連接資源,拼接一條 sql
偽代碼如下
// 這里假設 arr 的 key 和數(shù)據(jù)庫字段同步,其實大多數(shù)框架中在 php 操作數(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
這樣寫正常插入一萬條基本問題不大,除非數(shù)據(jù)很長,應付普通的批量插入夠用了,比如:批量生成卡號,批量生成隨機碼等等。。。
方法三:使用存儲過程
這個我手里正好再用這個就把 sql 付出來,具體業(yè)務邏輯大家自己組合一下就可以。
delimiter $$$
create procedure zqtest()
begin
declare i int default 0;
set i=0;
start transaction;
while i 80000 do
//your insert sql
set i=i+1;
end while;
commit;
delimiter;
call zqtest();
這個也只是個測試代碼,具體參數(shù)大家自行定義
我這里是一次插入 8 萬條,雖然不多但是,每一條數(shù)據(jù)量都很大,有很多 varchar4000 和 text 字段
耗時 6.524s
方法四:使用 MYSQL LOCAL_INFILE
這個我目前正在使用,所以順便把 pdo 的代碼也復上來,以便大家參考
// 設置 pdo 開啟 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 = 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 = 80000)
{
$i++;
fwrite($fhandler ,$sql . \r\n
}
$sql = LOAD DATA local INFILE . $myFile . INTO TABLE
$sql .= tablename ( . implode( , ,$arr_keys) . )
$pdo = $this- pdo_local_info ();
$res = $pdo- exec($sql);
if (!$res) {
//TODO 插入失敗
}
@unlink($my_file);
}
}
這個同樣每一條數(shù)據(jù)量都很大,有很多 varchar4000 和 text 字段
耗時 2.160s
以上滿足基本需求,100 萬數(shù)據(jù)問題不大,要不數(shù)據(jù)實在太大也涉及分庫分表了,或者使用隊列插入了。
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“mysql 批量錄入數(shù)據(jù)的方法”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業(yè)資訊頻道,更多相關知識等著你來學習!
向 AI 問一下細節(jié)