序文 最近、仕事の都合で、約 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 つはコンテンツを表す文字列です。 テスト中、各実験の最後に、 方法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 をご愛顧いただき、ありがとうございます。 以下もご興味があるかもしれません:
|
1. 設置前の清掃 rpm -qa | grep jdk rpm -qa | grep gcj yu...
目次概要1. フロントエンドとバックエンドの分離とWeb APIの優先ルート設計2. Axiosネッ...
1. 親コンポーネントはpropsを通じて子コンポーネントにデータを渡すことができる2. 子コンポー...
成果を達成する 実装コードhtml <div class="wrap"&g...
かなり前の記事で、 -webkit-box-reflectプロパティについて説明しました。リフレクシ...
HTML では、<img> タグはテキスト内の画像タグを定義するために使用されます。その...
この記事では、ネイティブ JS で実装されたデジタル時計エフェクトを紹介します。エフェクトは次のとお...
目次1. プロトタイプの関係2. プロトタイプチェーン3. 結論序文:前回の記事では、JavaScr...
これは本質的に、ビュー インターフェース構造を記述するために使用される共通の js オブジェクトです...
ダウンロードMySQL 公式ダウンロード、Windows (x86、64 ビット)、ZIP アーカイ...
Docker ネットワークの作成に –subnet を追加した後、docker network ls...
ナビゲーションバーの作成:技術要件: CS HTMLタグ達成目的:ナビゲーションバーメニューの作成コ...
crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用され...
目次1. ブリッジを設定し、検証のためにパケットをキャプチャする1. ブリッジデバイスとセッションを...
最近、MySQL オンラインでいくつかのデータ異常が発生しましたが、すべて早朝に発生しました。ビジネ...