前言
本文主要給大家介紹了關於mysql大批量插入數據的4種方法,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧
方法一:循環插入
這個也是最普通的方式,如果數據量不是很大,可以使用,但是每次都要消耗連接數據庫的資源。
大致思維如下
(我這里寫偽代碼,具體編寫可以結合自己的業務邏輯或者框架語法編寫)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
偽代碼如下
1
2
3
4
5
6
7
8
9
10
|
//這里假設arr的
key
和數據庫字段同步,其實大多數框架中在php操作數據庫的時候都是這么設計的
$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
|
這樣寫正常插入一萬條基本問題不大,除非數據很長,應付普通的批量插入夠用了,比如:批量生成卡號,批量生成隨機碼等等。。。
方法三:使用存儲過程
這個我手里正好再用這個就把sql付出來,具體業務邏輯大家自己組合一下就可以。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
;
end
$$$
delimiter;
call zqtest();
|
這個也只是個測試代碼,具體參數大家自行定義
我這里是一次插入8萬條,雖然不多但是,每一條數據量都很大,有很多varchar4000 和text字段
耗時 6.524s
方法四:使用MYSQL LOCAL_INFILE
這個我目前正在使用,所以順便把pdo的代碼也復上來,以便大家參考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
//設置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);
}
}
|
這個同樣每一條數據量都很大,有很多varchar4000 和text字段
耗時 2.160s
以上滿足基本需求,100萬數據問題不大,要不數據實在太大也涉及分庫分表了,或者使用隊列插入了。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。