MySQL での挿入効率のいくつかの例の比較

MySQL での挿入効率のいくつかの例の比較

序文

最近、仕事の都合で、約 1000w の大量のデータを MySQL に挿入する必要があり、時間がかかると思われます。そこで、どのデータ挿入方法がより高速かつ効率的であるかをテストしたいと思います。

以下では、さまざまなデータ量における各方法の挿入効率をテストします。

テスト データベースの基本と操作は次のとおりです。

mysql> データベーステストを作成します。
クエリは正常、1 行が影響を受けました (0.02 秒)
mysql> テストを使用します。
データベースが変更されました
mysql> テーブル mytable を作成します (id int 主キー auto_increment 、value varchar(50));
クエリは正常、影響を受けた行は 0 行 (0.35 秒)
mysql> desc mytable;
+-------+-------------+------+-----+---------+----------------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | 自動増分 |
| 値 | varchar(50) | はい | | NULL | |
+-------+-------------+------+-----+---------+----------------+
セットに2行(0.02秒)

テストの便宜上、ここでは 2 つのフィールドを持つテーブルが作成されます。1 つは自動増分 ID で、もう 1 つはコンテンツを表す文字列です。

テスト中、各実験の最後に、 mysql> truncate mytableを使用して既存のテーブルをクリアする必要があります。

方法1: 1つずつ挿入する

テストコード: (途中に1000個の挿入文があります。vimでコピー&ペーストすると便利です。書き込んだらa.sqlに保存し、MySQLプロンプトでsource a.sqlと入力してください)

@start=(current_timestamp(6) を選択) を設定します。
mytable に値 (null、"値") を挿入します。
......
mytable に値 (null、"値") を挿入します。
@end=(current_timestamp(6) を選択) を設定します。
@start を選択します。
@end を選択します。

出力:

クエリは正常、1 行が影響を受けました (0.03 秒)
......
クエリは正常、1 行が影響を受けました (0.03 秒)
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
+----------------------------+
| @開始 |
+----------------------------+
| 2016-05-05 23:06:51.267029 |
+----------------------------+
セット内の 1 行 (0.00 秒)
+----------------------------+
| @終了 |
+----------------------------+
| 2016-05-05 23:07:22.831889 |
+----------------------------+
セット内の 1 行 (0.00 秒)

消費された合計時間は 31.56486 秒です。実際、ほぼすべてのステートメントにはほぼ同じ時間がかかり、基本的には 30 ミリ秒です。

この方法では、1,000 万件のデータを処理するのに 87 時間かかります。

大量のデータに関しては、この方法は絶対にお勧めできないため、試すつもりはありません。

方法2: トランザクションベースのバッチ挿入

実際には、非常に多くのクエリを 1 つのトランザクションにまとめることになります。実際、方法 1 の各ステートメントはトランザクションを開くため、非常に遅くなります。

テストコード: (基本的には方法 1 と同様ですが、主に 2 行追加します。比較的高速なので、ここではさまざまなデータ量をテストします)

@start=(current_timestamp(6) を選択) を設定します。
トランザクションを開始します。
mytable に値 (null、"値") を挿入します。
......
mytable に値 (null、"値") を挿入します。
専念;
@end=(current_timestamp(6) を選択) を設定します。
@start を選択します。
@end を選択します。

テスト結果:

データ量時間(秒)
1k 0.1458
1週 1.0793
10週 5.546006
100w 38.930997

基本的には対数時間であり、効率が比較的高いことがわかります。

方法3: 1つのステートメントで一度に複数のデータセットを挿入する

つまり、挿入では一度に複数の値が挿入されます。

テストコード:

mytable に値 (null、"値") を挿入します。
    (null、"値")、
    ......
    (null、"値");

テスト結果:

データ量時間(秒)
1k 0.15
1週 0.80
10週2.14
100ワット*

これも対数時間のように見え、方法 2 よりもわずかに高速です。しかし、問題は、1 つの SQL ステートメントにバッファ サイズ制限があることです。設定を変更してバッファ サイズを大きくすることはできますが、大きすぎるサイズにすることはできません。そのため、大量のデータを挿入する場合は使用できません。

方法4: データファイルをインポートする

数値データをデータ ファイルに書き込み、直接インポートします (前のセクションを参照)。

データファイル(a.dat):

NULL値
NULL値
.....
NULL値
NULL値

テストコード:

mysql> ローカル入力ファイル「a.dat」のデータをテーブル mytable にロードします。

テスト結果:

データ量時間(秒)
1k 0.13
1週 0.75
10週1.97
100ワット6.75
1000w 58.18

彼が一番速いです。 。 。 。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただき、ありがとうございます。

以下もご興味があるかもしれません:
  • C++ を使用して大量のデータを MySQL に挿入する際の効率の悪さを解決する方法
  • Java は JDBC を使用して 100,000 件のレコードを MySQL データベースにバッチ挿入します (テスト効率)
  • MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明
  • MySQLに何百万ものテストデータを素早く挿入する方法
  • 1 つの MySQL ステートメントで複数のレコードを挿入する
  • MYSQL バッチ挿入データ実装コード
  • MySQLデータベースの挿入速度と読み取り速度の調整記録
  • MySql でレコードの重複挿入を回避するいくつかの方法

<<:  docker エントリポイントファイルの詳細な説明

>>:  JavaScriptでカレンダー効果を素早く実装

推薦する

MySQLのユーザーアカウント管理と権限管理の詳細な説明

序文MySQL の権限テーブルは、データベースの起動時にメモリにロードされます。ユーザーが ID 認...

MySQL 8.0 エラー サーバーがクライアントに不明な認証方法を要求しました 解決策

最新バージョンのMySQL 8.0.11をインストールした後、ユーザーを作成して認証します。認証され...

MySQL でテーブル データを削除した後もディスク領域がまだ占有されているのはなぜですか?

目次1.MySQLデータ構造2. テーブルファイルのサイズは変更されておらず、MySQLの設計に関連...

Vueはel-tableを使用して列と行を動的に結合します

この記事の例では、el-tableを使用して列と行を動的にマージするVueの具体的なコードを参考まで...

Dockerfileを使用してDockerイメージを構築する

目次Dockerfileを使用してDockerイメージを構築する1. Dockerfile とは何で...

CSSはコーナーカット+ボーダー+投影+コンテンツ背景色のグラデーション効果を実現します

CSS を使用するだけで、コーナーカット + ボーダー + 投影 + コンテンツの背景色のグラデーシ...

モバイルフロントエンド適応ソリューション(概要)

ネットで検索してみたところ、多くの面接でモバイル適応方法について質問されることが分かりました。最近い...

nginxカスタム変数と組み込み定義済み変数の使用

概要Nginx では変数を使用して設定を簡素化し、設定の柔軟性を向上させることができます。すべての変...

jsのディープコピーを理解しましょう

目次js ディープコピーデータ保存方法浅いコピー/深いコピーとは何か一般的なディープコピーの実装1....

divコンテナ内の背景色または画像は、サイズが大きくなるにつれて大きくなります。

コードをコピーコードは次のとおりです。高さ:自動 !重要;高さ:550px;最小高さ:550px; ...

仮想マシンに Windows Server 2008 オペレーティング システムをインストールする

この記事では、Windows Server オペレーティング システムのインストールと企業でのそのア...

CentOS 7 で NFS ファイル共有ストレージ サービスを構築するための完全な手順

序文NFS (Network File System) は、ネットワーク ファイル システムを意味し...

CentOS 7.5 が Varnish キャッシュサーバー機能を導入

1. ワニスの紹介Varnish は、高性能なオープンソースのリバースプロキシサーバーおよび HTT...

6ull が Linux ドライバ モジュールをロードできない問題の解決方法

目次0x01 ドライバーモジュールのロードに失敗しました0x02 ソリューション要約する0x01 ド...