MySQL データベース シェル import_table データ インポート

MySQL データベース シェル import_table データ インポート

MySQL Shell import_table データのインポート

1. import_tableの紹介

この号では、MySQL Shell ツールセットの効率的なデータインポートツール、import_table を紹介します。このツールの正式名称は Parallel Table Import Utility です。名前が示すように、同時データインポートをサポートします。このツールは、MySQL Shell バージョン 8.0.23 以降でより完全な機能を備えています。以下に、このツールのコア機能を示します。

  • 基本的にMySQL Data Loadのすべての機能をカバーしており、代替として使用できます。
  • 同時インポートはデフォルトでサポートされています(カスタムチャンクサイズをサポート)
  • ワイルドカードマッチングをサポートし、複数のファイルを同時に 1 つのテーブルにインポートします (同じ構造のデータを 1 つのテーブルに集約するのに非常に適しています)
  • 速度制限をサポート(高帯域幅を必要とするシナリオに最適)
  • 圧縮ファイルの処理をサポート
  • MySQL 5.7以降へのインポートをサポート

2. データのロードとテーブル関数のインポートの例

このセクションでは、テーブルのインポートやデータのロードと同じ機能のコマンド例を示します。MySQL データのロードの包括的なシナリオを示すために、employees テーブルのサンプル データを例として引き続き使用します。

  • カスタム順序でデータをインポートする
  • データ関数処理
  • カスタムデータ値

サンプルデータは次のとおりです。

[root@10-186-61-162 tmp]# cat employees_01.csv
「10001」、「1953-09-02」、「ゲオルギ」、「ファチェッロ」、「M」、「1986-06-26」
"10003","1959-12-03","Parto","Bamford","M","1986-08-28"
「10002」、「1964-06-02」、「ベザレル」、「ジンメル」、「F」、「1985-11-21」
「10004」、「1954-05-01」、「クリスチャン」、「コブリック」、「M」、「1986-12-01」
「10005」、「1955-01-21」、「京一」、「マリニアック」、「M」、「1989-09-12」
"10006","1953-04-20","アンネケ","プロイジグ","F","1989-06-02"
"10007","1957-05-23","ツヴェタン","ジエリンスキー","F","1989-02-10"
「10008」、「1958-02-19」、「サニヤ」、「カルーフィ」、「M」、「1994-09-15」
「10009」、「1952-04-19」、「スマント」、「ピース」、「F」、「1985-02-18」
「10010」、「1963-06-01」、「ドゥアンケオ」、「ピヴェトー」、「F」、「1989-08-24」

テーブル構造の例:

 10.186.61.162:3306 従業員 SQL > desc emp;
+-------------+---------------+------+-----+--------+-------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 | 
+-------------+---------------+------+-----+--------+-------+
| emp_no | int | NO | PRI | NULL | |
| 生年月日 | 日付 | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| full_name | varchar(64) | YES | | NULL | | -- テーブルに新しく追加されたフィールドですが、エクスポートされたデータ ファイルには存在しません | gender | enum('M','F') | NO | | NULL | |
| hire_date | 日付 | NO | | NULL | |
| modify_date | datetime | YES | | NULL | | -- エクスポートされたデータ ファイルに存在しない新しいフィールドがテーブルに追加されます| delete_flag | varchar(1) | YES | | NULL | | -- エクスポートされたデータ ファイルに存在しない新しいフィールドがテーブルに追加されます+-------------+---------------+------+------+--------+--------+

2.1 Load Dataを使用したデータのインポート

'/data/mysql/3306/tmp/employees_01.csv' ファイルにデータをロードします。
employees.emp テーブルに
文字セット utf8mb4
フィールドは ',' で終了します
'"' で囲まれている
'\n' で終了する行
(@C1、@C2、@C3、@C4、@C5、@C6)
emp_no=@C1 に設定し、
    生年月日=@C2,
    first_name=大文字(@C3)、
    last_name=小文字(@C4)、
    フルネーム=concat(名,' ',姓),
    性別=@C5,
    雇用日=@C6、
    修正日 = now(),
    delete_flag=if(hire_date<'1988-01-01','Y','N');

2.2 import_tableを使用したデータのインポート

util.import_table(
    [
        "/data/mysql/3306/tmp/employees_01.csv",
    ]、
    {
        「スキーマ」: 「従業員」、 
        "テーブル": "emp",
        「方言」: 「csv-unix」、
        "行をスキップ": 0,
        "showProgress": 真、
        "文字セット": "utf8mb4",
        "columns": [1,2,3,4,5,6], ## ファイル内の列と同じ数のシリアル番号を使用します "decodeColumns": {
            "emp_no": "@1"、##はファイル「birth_date ":"@2 "の最初の列に対応します。 name ":" concat(@3、 ''、@4) "、##ファイルの3列目と4番目の列を1つの列にマージして、テーブル「ジェンダー」:"@5 "でフィールド値を生成します。 delete_flag ":" if(@6 <'1988-01-01'、 'y'、 'n') "##ファイルの6番目の列に基づいて論理的な判断を下し、テーブルで対応するフィールド値を生成します}
    }) 

3. import_table固有の機能

3.1 複数ファイルのインポート(ファジーマッチング)

## インポートする前に、3 つの個別の従業員ファイルを生成し、エクスポートされた構造は一貫しています [root@10-186-61-162 tmp]# ls -lh
総使用量: 1.9G
-rw-r----- 1 mysql mysql 579 3月24日 19:07 employees_01.csv
-rw-r----- 1 mysql mysql 584 3月24日 18:48 employees_02.csv
-rw-r----- 1 mysql mysql 576 3月24日 18:48 employees_03.csv
-rw-r----- 1 mysql mysql 1.9G 3月26日 17:15 sbtest1.csv

## インポートコマンド。employees_* はあいまい一致に使用されます util.import_table(
    [
        "/data/mysql/3306/tmp/employees_*",
    ]、
    {
        「スキーマ」: 「従業員」、 
        "テーブル": "emp",
        「方言」: 「csv-unix」、
        "行をスキップ": 0,
        "showProgress": 真、
        "文字セット": "utf8mb4",
        "columns": [1,2,3,4,5,6], ## ファイル内の列と同じ数のシリアル番号を使用します "decodeColumns": {
            "emp_no": "@1"、##はファイル「birth_date ":"@2 "の最初の列に対応します。 name ":" concat(@3、 ''、@4) "、##ファイルの3列目と4番目の列を1つの列にマージして、テーブル「ジェンダー」:"@5 "でフィールド値を生成します。 delete_flag ":" if(@6 <'1988-01-01'、 'y'、 'n') "##ファイルの6番目の列に基づいて論理的な判断を下し、テーブルで対応するフィールド値を生成します}
    })
    
## インポートするファイルのパスが明確に指定されているインポートコマンド util.import_table(
    [
        "/data/mysql/3306/tmp/employees_01.csv",
        "/data/mysql/3306/tmp/employees_02.csv",
        "/data/mysql/3306/tmp/employees_03.csv"
    ]、
    {
        「スキーマ」: 「従業員」、 
        "テーブル": "emp",
        「方言」: 「csv-unix」、
        "行をスキップ": 0,
        "showProgress": 真、
        "文字セット": "utf8mb4",
        "columns": [1,2,3,4,5,6], ## ファイル内の列と同じ数のシリアル番号を使用します "decodeColumns": {
            "emp_no": "@1"、##はファイル「birth_date ":"@2 "の最初の列に対応します。 name ":" concat(@3、 ''、@4) "、##ファイルの3列目と4番目の列を1つの列にマージして、テーブル「ジェンダー」:"@5 "でフィールド値を生成します。 delete_flag ":" if(@6 <'1988-01-01'、 'y'、 'n') "##ファイルの6番目の列に基づいて論理的な判断を下し、テーブルで対応するフィールド値を生成します}
    })

3.2 同時インポート

同時インポートを実験する前に、同時実行をシミュレートするために 1,000 万の sbtest1 テーブル (約 2G のデータ) を作成します。import_table パラメータは同時実行構成としてスレッドを使用し、デフォルトは 8 同時実行です。

## テストに必要な sbtest1 データをエクスポートします [root@10-186-61-162 tmp]# ls -lh
総使用量: 1.9G
-rw-r----- 1 mysql mysql 579 3月24日 19:07 employees_01.csv
-rw-r----- 1 mysql mysql 584 3月24日 18:48 employees_02.csv
-rw-r----- 1 mysql mysql 576 3月24日 18:48 employees_03.csv
-rw-r----- 1 mysql mysql 1.9G 3月26日 17:15 sbtest1.csv

## スレッドを8つ同時に実行できるようにする util.import_table(
    [
        "/data/mysql/3306/tmp/sbtest1.csv",
    ]、
    {
        「スキーマ」: 「デモ」、 
        "テーブル": "sbtest1",
        「方言」: 「csv-unix」、
        "行をスキップ": 0,
        "showProgress": 真、
        "文字セット": "utf8mb4",
        "スレッド": "8"
    })

3.3 輸入率の規制

maxRate と threads を使用して、各同時スレッドのインポート データを制御できます。たとえば、現在の構成に 4 つのスレッドがあり、各スレッドのレートが 2M/s の場合、最大値は 8M/s を超えません。

util.import_table(
    [
        "/data/mysql/3306/tmp/sbtest1.csv",
    ]、
    {
        「スキーマ」: 「デモ」、 
        "テーブル": "sbtest1",
        「方言」: 「csv-unix」、
        "行をスキップ": 0,
        "showProgress": 真、
        "文字セット": "utf8mb4",
        "スレッド": "4",
        "最大レート": "2M"
    }) 

3.4 カスタムチャンクサイズ

デフォルトのチャンク サイズは 50M です。チャンク サイズを調整してトランザクション サイズを縮小することができます。たとえば、チャンク サイズを 1M に調整すると、各スレッドによって毎回インポートされるデータの量もそれに応じて削減されます。

util.import_table(
    [
        "/data/mysql/3306/tmp/sbtest1.csv",
    ]、
    {
        「スキーマ」: 「デモ」、 
        "テーブル": "sbtest1",
        「方言」: 「csv-unix」、
        "行をスキップ": 0,
        "showProgress": 真、
        "文字セット": "utf8mb4",
        "スレッド": "4",
        "バイト/チャンク": "1M",
        "最大レート": "2M"
    }) 

4. Load Dataとimport_tableのパフォーマンス比較

  • 同じライブラリテーブルを使用する
  • データに特別な処理は行われず、そのままインポートするだけです
  • デフォルトのパラメータを変更せず、必要なパラメータのみを指定します。
-- データロードステートメント load data infile '/data/mysql/3306/tmp/sbtest1.csv'
テーブルdemo.sbtest1に
文字セット utf8mb4
フィールドは ',' で終了します
'"' で囲まれている
'\n' で終了する行

-- import_table ステートメント util.import_table(
    [
        "/data/mysql/3306/tmp/sbtest1.csv",
    ]、
    {
        「スキーマ」: 「デモ」、 
        "テーブル": "sbtest1",
        「方言」: 「csv-unix」、
        "行をスキップ": 0,
        "showProgress": 真、
        "文字セット": "utf8mb4"
    })

ご覧のとおり、データのロードには約 5 分かかりますが、import_table ではデータのインポートが半分以下の時間で完了します。これは 2 倍以上の効率です (仮想マシン環境のディスク IO 容量が制限されている条件下で)。

上記はMySQL Shellのimport_tableデータインポートの詳細です。import_tableデータインポートの詳細については、123WORDPRESS.COMの他の関連記事に注意してください。

以下もご興味があるかもしれません:
  • MySQL データベースインスタンスに接続、読み取り、書き込み、操作するためのシェルスクリプト
  • MySQL データベースのデータを定期的にバックアップし、指定した期間保持するシェル スクリプト
  • シェルスクリプトを使用して、サーバー上にMySQLデータベースアカウントを一括作成します。
  • MySQL Shellを使用してデータベースに接続する方法を教えます

<<:  docker-maven-plugin の詳細な使用方法

>>:  スパンの最小高さを定義するソリューションは効果がありません

推薦する

CSS3 で作成された背景グラデーションアニメーション効果

成果を達成する 実装コードhtml <h1 class="text-light&qu...

js シンプルで粗雑なパブリッシュとサブスクライブのサンプルコード

パブリッシュ/サブスクライブとは何ですか?例を挙げてみましょう。あなたは服を買うために店に行きます。...

JavaScript イベント ループのケース スタディ

js のイベント ループJavaScript はシングルスレッドなので、同じイベントで実行できるメソ...

Linux TTY/PTS の違いの概要

キーボードで文字を入力すると、対応するプロセスにどのように送信されるのでしょうか? ps や who...

js キャンバスは角丸画像を実現します

この記事では、角を丸くするためのjsキャンバスの具体的なコードを参考までに紹介します。具体的な内容は...

Ubuntu の起動後にアプリケーションを実行するためのターミナルの設定方法

1.メニューバーにスタートと入力し、スタートアップアプリケーションをクリックして入力します。 2. ...

Reactを使用して画像認識アプリを実装する方法

まずは効果の写真をお見せしましょう。 個人的には効果は問題ないと思います。アプリが写真を学習する時間...

Linux に MySql 5.7.21 をインストールするための詳細な手順

序文Linux で最も広く使用されているデータベースは MySQL です。この記事では、Linux ...

W3C チュートリアル (12): W3C SOAP アクティビティ

Web サービスは、アプリケーション間の通信に関係しています。SOAP は、Web サービス間の X...

Reactソースコードにおけるビット演算について詳しく説明します

目次序文いくつかの一般的なビット操作ビットAND (&)ビットOR (|)ビット否定(~)マ...

TypeScript ジェネリックを簡単に説明する方法

目次概要ジェネリック医薬品とはビルドシステムジェネリック医薬品の一般的な理解ジェネリッククラスジェネ...

MySQL 5.7.13 ソースコードのコンパイル、インストール、および構成方法のグラフィックチュートリアル

インストール環境: CentOS7 64ビットMINI版公式ソースコードのコンパイルおよびインストー...

マークアップ言語 -

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

MySQL で重複しない携帯電話番号テーブルをバッチ生成する方法のサンプルコード

序文多くの MySQL テスト シナリオでは、テスト用に一部のテスト データを手動で生成する必要があ...

Web デザインのための 5 つのシンプルな XHTML Web フォーム

Web デザイン 5 におけるシンプルな XHTML Web フォーム。 テクニック 1: ラベル ...