Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


MySQL 8.0 リファレンスマニュアル  /  ...  /  MyISAM テーブルの一括データロード

このページは機械翻訳したものです。

8.6.2 MyISAM テーブルの一括データロード

これらのパフォーマンスのヒントは、セクション8.2.5.1「INSERT ステートメントの最適化」の高速挿入の一般的なガイドラインを補足するものです。

  • MyISAM テーブルでは、データファイルの途中に削除された行がない場合、SELECT ステートメントの実行中に同時に、同時挿入を使用して行を追加できます。 セクション8.11.3「同時挿入」を参照してください。

  • 一部の追加作業では、テーブルに多数のインデックスがある場合に、MyISAM テーブルに対して LOAD DATA をさらに高速に実行できます。 次の手順を使用します。

    1. FLUSH TABLES ステートメントまたは mysqladmin flush-tables コマンドを実行します。

    2. テーブルのインデックスのすべての使用を削除するには、myisamchk --keys-used=0 -rq /path/to/db/tbl_name を使用します。

    3. LOAD DATA を使用してテーブルにデータを挿入します。 これはインデックスを更新しないため、非常に高速です。

    4. 今後、テーブルから読み取りだけをする場合は、myisampack を使用してそれを圧縮します。 セクション16.2.3.3「圧縮テーブルの特徴」を参照してください。

    5. myisamchk -rq /path/to/db/tbl_name を使用してインデックスを再作成します。 これにより、ディスクに書き込む前にメモリーにインデックスツリーが作成されます。これは、多くのディスクシークが回避されるため、LOAD DATA 中にインデックスを更新するよりはるかに高速です。 結果のインデックスツリーは完全にバランスも取れています。

    6. FLUSH TABLES ステートメントまたは mysqladmin flush-tables コマンドを実行します。

    データを挿入する MyISAM テーブルが空の場合、LOAD DATA は前述の最適化を自動的に実行します。 自動最適化とプロシージャの明示的な使用の主な違いは、LOAD DATA ステートメントの実行時にサーバーがインデックスの再作成に割り当てることができるよりも多くの一時メモリーを myisamchk でインデックス作成に割り当てることができることです。

    myisamchk の代わりに次のステートメントを使用して、MyISAM テーブルの一意でないインデックスを無効または有効にすることもできます。 これらのステートメントを使用する場合は、FLUSH TABLES 操作をスキップできます:

    ALTER TABLE tbl_name DISABLE KEYS;
    ALTER TABLE tbl_name ENABLE KEYS;
  • 非トランザクションテーブルに対して、複数ステートメントで実行される INSERT 操作を高速化するには、テーブルをロックします。

    LOCK TABLES a WRITE;
    INSERT INTO a VALUES (1,23),(2,34),(4,33);
    INSERT INTO a VALUES (8,26),(6,29);
    ...
    UNLOCK TABLES;

    これは、すべての INSERT ステートメントの完了後に、インデックスバッファーが 1 回だけディスクにフラッシュされるため、パフォーマンスにメリットがあります。 通常は、INSERT ステートメントの数と同じだけ、インデックスバッファーのフラッシュが行われます。 すべての行を 1 つの INSERT で挿入できる場合は、明示的なロックステートメントは必要ありません。

    ロックは複数接続テストの合計時間も短縮しますが、個々の接続がロックを待機するため、それらの最大待機時間は長くなることがあります。 次のように 5 台のクライアントが同時に挿入の実行を試みるとします。

    • 接続 1 は 1000 回の挿入を実行します

    • 接続 2、3、および 4 は 1 回の挿入を実行します

    • 接続 5 は 1000 回の挿入を実行します

    ロックを使用しない場合、接続 2、3、および 4 は 1 と 5 の前に終了します。 ロックを使用した場合、接続 2、3、および 4 は 1 または 5 の前に終了しない可能性がありますが、合計時間は約 40% 高速化するはずです。

    MySQL では、INSERTUPDATE、および DELETE 操作はきわめて高速ですが、約 5 回超の連続した挿入や更新を実行するすべての操作の周囲にロックを追加することによって、全体のパフォーマンスを向上できます。 著しく多くの連続した挿入を実行する場合、LOCK TABLES のあとにときどき (1,000 行程度ごとに) UNLOCK TABLES を実行して、ほかのスレッドのテーブルへのアクセスを許可できます。 これによってもパフォーマンスの向上が得られます。

    INSERT では、前述の戦略を使用している場合でも、データのロードは LOAD DATA よりもはるかに遅くなります。

  • MyISAM テーブルのパフォーマンスを向上させるには、LOAD DATAINSERT の両方について、key_buffer_size システム変数を増やしてキーキャッシュを拡大します。 セクション5.1.1「サーバーの構成」を参照してください。