4つの方法をデータの挿入例を大量にMYSQL

序文

本論文では、あなたの参照のための学習を共有し、大量のデータ挿入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++
}

あまりにも一般的なだけでなく、同時に支障なくのですることは今日ここに私のメインの書き込みではないので、私は言うことはありません

方法2:接続リソースを減らし、スプライシング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

適切に少し1万基本的な問題に挿入された書き込みは、のような、通常のバルク挿入に対処する十分な長さのデータがない限り:バッチ生産番号、バッチはランダムなコードを生成し、というように。

方法3:ストアド・プロシージャの使用

これはちょうど私の手で、その後、特定のビジネスロジックにどのようなことができますが、すべて自分の組み合わせを支払ったこの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();

これは、テストコードで、彼らは自分の特定のパラメータを定義します

私は小さなが、しかし、各データの量が多い一方で、多くのvarchar4000テキストフィールドとがあり、最初にここにあった8万挿入
時間がかかり6.524sは

方法4:使用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
public function pdo_local_info ()
{
   global $system_dbserver;
   $dbname = '[email protected]' ;
   $ip  = '[email protected]' ;
   $ user = '[email protected]' ;
   $pwd  = '[email protected]' ;
   $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 . "[email protected]/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万数据问题不大,要不数据实在太大也涉及分库分表了,或者使用队列插入了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

おすすめ

転載: www.cnblogs.com/bit5566/p/12185463.html