ホームページ  >  記事  >  データベース  >  mysqlにデータをバッチで入力する方法

mysqlにデータをバッチで入力する方法

coldplay.xixi
coldplay.xixiオリジナル
2021-01-04 17:47:3711527ブラウズ

Mysql バッチ データ入力方法: 1. ループ挿入を使用する; 2. 接続リソースを減らして SQL を結合する; 3. ストアド プロシージャを使用する; 4. [MYSQL LOCAL_INFILE] を使用する。

mysqlにデータをバッチで入力する方法

このチュートリアルの動作環境: Windows 7 システム、mysql バージョン 8.0.22、DELL G3 コンピューターこの方法は、すべてのブランドのコンピューターに適しています。

関連する無料学習の推奨事項: mysql ビデオ チュートリアル

Mysql バッチ データ入力方法:

方法 1 :ループ挿入

これも最も一般的な方法で、データ量がそれほど大きくなければ使用できますが、毎回データベースに接続するためリソースを消費します。

一般的な考え方は次のとおりです

(ここでは疑似コードを記述します。具体的な記述は独自のビジネス ロジックまたはフレームワーク構文と組み合わせることができます)

for($i=1;$i<=100;$i++){
 $sql = &#39;insert...............&#39;;
 //querysql
}
foreach($arr as $key => $value){
$sql = &#39;insert...............&#39;;
 //querysql
}
while($i <= 100){
$sql = &#39;insert...............&#39;;
 //querysql
 $i++
}

一般的すぎて、同時に難しくありません。同時に、これは私が今日主に書いていることではないので、ここでは多くは言いません。

方法 2: 接続リソースを削減し、接続リソースを減らして接続します。 sql

疑似コードは次のとおりです

//这里假设arr的key和数据库字段同步,其实大多数框架中在php操作数据库的时候都是这么设计的
$arr_keys  = array_keys($arr);
$sql    = &#39;INSERT INTO tablename (&#39; . implode(&#39;,&#39; ,$arr_keys) . &#39;) values&#39;;
$arr_values  = array_values($arr);
$sql    .= " (&#39;" . implode("&#39;,&#39;" ,$arr_values) . "&#39;),";
$sql    = substr($sql ,0 ,-1);
//拼接之后大概就是 INSERT INTO tablename (&#39;username&#39;,&#39;password&#39;) values
(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;)
.......
//querysql

このように通常の挿入を 10,000 回記述することは大きな問題ではありません。データが非常に長くない限り、通常の挿入を処理するのに十分です。バッチ挿入。カード番号のバッチ生成、ランダム コードのバッチ生成など。 。 。

方法 3: ストアド プロシージャを使用する

私はたまたまこれを SQL の支払いに使用しました。特定のビジネス ロジックを自分で組み合わせることができます。

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();

これは単なるテスト コードです。特定のパラメーターを自分で定義できます

一度に 80,000 個のアイテムを挿入しています。それほど多くはありませんが、各アイテムのデータ量はサイズが大きく、varchar4000 が多く、テキスト フィールド

には 6.524 秒かかります

方法 4: MYSQL LOCAL_INFILE

I を使用します現在これを使用しているので、参考までに PDO コードもコピーしておきます

//设置pdo开启MYSQL_ATTR_LOCAL_INFILE
/*hs96.cn@gmail.com
public function pdo_local_info ()
{
  global $system_dbserver;
  $dbname = &#39;hs96.cn@gmail.com&#39;;
  $ip  = &#39;hs96.cn@gmail.com&#39;;
  $user = &#39;hs96.cn@gmail.com&#39;;
  $pwd  = &#39;hs96.cn@gmail.com&#39;;
  $dsn  = &#39;mysql:dbname=&#39; . $dbname . &#39;;host=&#39; . $ip . &#39;;port=3306&#39;;
  $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"] . &#39;/&#39;;
  $my_file   = $root_dir . "hs96.cn@gmail.com/sql_cache/" . $order[&#39;OrderNo&#39;] . &#39;.sql&#39;;
  $fhandler   = fopen($my_file,&#39;a+&#39;);
  if ($fhandler) {
  $sql = implode("\t" ,$arr);
   $i = 1;
   while ($i <= 80000)
   {
    $i++;
    fwrite($fhandler ,$sql . "\r\n");
   }
   $sql = "LOAD DATA local INFILE &#39;" . $myFile . "&#39; INTO TABLE ";
   $sql .= "tablename (" . implode(&#39;,&#39; ,$arr_keys) . ")";
   $pdo = $this->pdo_local_info ();
   $res = $pdo->exec($sql);
   if (!$res) {
    //TODO 插入失败
   }
   @unlink($my_file);
  }
}

各データもデータ量が多く、varchar4000 やテキスト フィールドも多数あります

2.160 秒かかります

上記は基本的なニーズを満たしています。100 万のデータは大きな問題ではありませんが、それ以外の場合、データが大きすぎてサブデータベースやテーブルが関与するか、キューを使用して挿入されます。

以上がmysqlにデータをバッチで入力する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。