MySQL に大量のデータを挿入する 4 つの方法の例

MySQL に大量のデータを挿入する 4 つの方法の例

序文

この記事では主に、MySQLに大量のデータを挿入する4つの方法を紹介し、参考と学習のために共有します。詳しい紹介を見てみましょう。

方法1: ループ挿入

これも最も一般的な方法です。データ量が多くない場合は使用できますが、毎回データベースに接続するためにリソースを消費します。

基本的な考え方は次の通りです

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

($i=1;$i<=100;$i++) の場合{
 $sql = '挿入.............';
 //クエリSQL
}
foreach($arr を $key => $value として){
$sql = '挿入.............';
 //クエリSQL
}
$i <= 100 の間{
$sql = '挿入.............';
 //クエリSQL
 $i++
}

それはあまりにも一般的であり、難しくもないし、今日私が主に書いている内容ではないので、ここではこれ以上述べません。

方法2: 接続リソースを減らしてSQL文を結合する

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

//ここでは、arr のキーがデータベース フィールドと同期されていると想定しています。実際、ほとんどのフレームワークは、PHP でデータベースを操作するときにこの設計を使用します。$arr_keys = array_keys($arr);
$sql = 'INSERT INTO tablename (' . implode(',' ,$arr_keys) . ') 値';
$arr_values ​​= array_values($arr);
$sql .= " ('" . implode("','" ,$arr_values) . "'),";
$sql = substr($sql,0,-1);
// スプライシング後、おそらく INSERT INTO tablename ('username','password') 値になります 
('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx')
.......
//クエリSQL

この書き方は、データが非常に長い場合を除き、通常 10,000 件のレコードを挿入する場合に基本的に問題ありません。カード番号のバッチ生成、ランダム コードのバッチ生成など、通常のバッチ挿入を処理するには十分です。 。 。

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

私はこれを手に入れ、SQL を提供します。特定のビジネス ロジックを自分で組み合わせることができます。

区切り文字 $$$
プロシージャ zqtest() を作成する
始める
i int をデフォルトで 0 と宣言します。
i=0 に設定します。
トランザクションを開始します。
i<80000の場合
 //挿入SQL 
i=i+1 と設定します。
終了しながら;
専念;
終わり
$$$
デリミタ;
zqtest() を呼び出す。

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

一度に 80,000 件のレコードを挿入しています。多くはありませんが、各レコードには大量のデータがあり、varchar4000 とテキスト フィールドが多数あります。6.524 秒かかります。

方法4: MYSQL LOCAL_INFILEを使用する

私は現在これを使用しているので、参考のためにpdoコードをここにコピーしました

//pdo を設定して MYSQL_ATTR_LOCAL_INFILE を有効にする
/*[email protected]
パブリック関数 pdo_local_info()
{
  グローバル $system_dbserver;
  $dbname = '[email protected]';
  メールアドレス
  ユーザーID
  $pwd = '[email protected]';
  $dsn = 'mysql:dbname=' . $dbname . ';host=' . $ip . ';port=3306';
  $options = [PDO::MYSQL_ATTR_LOCAL_INFILE => true];
  $db = 新しい PDO ($dsn、$user、$pwd、$options);
  $db を返します。
 }
//疑似コードは以下のとおりです public function test(){
  配列キーを配列要素に代入します。
  $root_dir = $_SERVER["DOCUMENT_ROOT"] . '/';
  $my_file = $root_dir . "[email protected]/sql_cache/" . $order['OrderNo'] . '.sql';
  $fhandler = fopen($my_file, 'a+');
  ($fhandler) の場合 {
  $sql = implode("\t"、$arr);
   $i = 1;
   ($i <= 80000) の間
   {
    $i++;
    fwrite($fhandler、$sql。"\r\n");
   }
   $sql = "LOAD DATA ローカル INFILE '" . $myFile . "' INTO TABLE ";
   $sql .= "tablename (" . implode(',' ,$arr_keys) . ")";
   pdo_local_info は、ローカル コンピュータで実行する必要があります。
   $res = $pdo->exec($sql);
   もし (!$res) {
    //TODO 挿入に失敗しました}
   @unlink($my_file);
  }
}

これも大量のデータがあり、varchar4000 とテキスト フィールドが多数あります。

所要時間: 2.160秒

上記は基本的な要件を満たしています。100 万のデータ ポイントは大きな問題ではありません。そうでない場合、データが大きすぎると、データベースとテーブルをシャーディングしたり、挿入にキューを使用したりする必要があるかもしれません。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MYSQL バッチ挿入データ実装コード
  • MySQL でバッチ挿入を実装してパフォーマンスを最適化するチュートリアル
  • ユニークインデックスを使用したMySQLバッチ挿入を回避する方法
  • MySQLは挿入を使用して複数のレコードを挿入し、データを一括で追加します。
  • MySQL バッチ挿入ループの詳細なサンプルコード
  • MySQL バッチデータ挿入スクリプト
  • MySQL バッチ SQL 挿入パフォーマンス最適化の詳細な説明
  • MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明
  • MySQLバッチは関数ストアドプロシージャを通じてデータを挿入します

<<:  GIFアニメーション効果を模倣した自動ビデオ再生を実現するWeChatアプレットの例

>>:  テキスト ファイルの並べ替えに役立つ Awk コマンドラインまたはスクリプト (推奨)

推薦する

vueプロジェクトは特定の領域に透かしを描くことを実現する

この記事では、Vueを使用して特定の領域に透かしを描く方法を紹介します。具体的な内容は次のとおりです...

Mysql5.7 のグループ連結関数を使用するときにデータが切り捨てられる問題に対する完璧な解決策

一昨日、本番環境でGROUP_CONCAT関数を使用して選択したデータが切り捨てられ、最大長が102...

CentOS 環境で NFS リモート ディレクトリ マウントを使用する手順の紹介

目次1. NFS の概要2. NFS構築1. NFSサーバーの構築2. NFSクライアントの構築3....

MySQL トランザクション分離レベルの表示と変更の例

トランザクション分離レベルを確認するMySQL では、'%tx_isolation%'...

MySQLサービスを削除する具体的な方法

MySQLは次のエラーを表示します「コントロール パネル -> 管理ツール -> サービ...

JavaScriptクロージャの原理と機能の詳細な説明

目次導入クロージャの使用カレー作りパブリック変数の実装キャッシュカプセル化(属性のプライベート化)閉...

Reactフックの長所と短所

目次序文アドバンテージ:欠点: 1. レスポンシブな使用効果2. ステータスが同期されていないRea...

Vue フロントエンド開発における階層的にネストされたコンポーネント間の通信の詳細な説明

目次序文例まとめ序文Vue の親子コンポーネントは、props を通じて親コンポーネントの値を子コン...

MySQL外部キーの基本的な機能と使用方法の詳細な説明

この記事では、例を使用して、MySQL 外部キーの基本的な機能と使用方法を説明します。ご参考までに、...

LinuxでHomebrewを使用する正しい方法

多くの人が Linux Homebrew を使用しています。これをより良く使用するための 3 つのヒ...

位置固定オフセット問題を解決する方法の詳細な説明

質問CSS 固定配置の position:fixed は非常に使いやすいです。ブラウザのビューポート...

値の転送を実現するために、2つの同じレベルのコンポーネントをVueで作成します。

Vue コンポーネントは接続されているため、コンポーネント間で値を渡す必要があるのは避けられません...

HiveメタデータをMySQLに設定するプロセス全体

Hiveのインストールディレクトリで、confディレクトリに入り、hive-site.xmlファイル...

MySQL 接続制御プラグインの紹介

目次1. 接続制御プラグイン(connection_control)の紹介1.1 connectio...