3

約700万行のテーブルがあります。1 日に 1 回、約 200,000 の新しい行をこのテーブルに一括インポートする必要があります。これを行うには、最初に を使用してテーブルのキーを無効にしLOAD DATA INFILE、次にテーブルのキーを再度有効にします。

私が抱えている問題は、ALTER TABLE my_table ENABLE KEYSステートメントにあります。
完了するまでに約 15 分かかります。を増やしてパフォーマンスを改善しようとしてmyisam_sort_buffer_sizeいますが、役に立たないようです。他のアイデアはありますか?

4

2 に答える 2

3

mysqladmin や myisamchk などの外部 MySQL ツールを試すことができます。通常のインストールでは、それらは /usr/local/mysql/bin パスにあります。

MySQL Web サイトからのソリューション パス:

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

  • myisamchk --keys-used=0 -rq /path/to/db/tbl_name を使用します。これにより、テーブルのインデックスの使用がすべて削除されます。

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

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

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

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

mysql の公式ドキュメント

于 2010-12-19T10:00:22.723 に答える
1

テーブルがロックされていることによるダウンタイムを最小限に抑えたいと仮定すると、標準的な手順は、テーブルを複製し、クローンに挿入を実行し (特定の状況に応じてキーを無効にするかどうかに関係なく)、完了したら、DROP TABLE tableName;RENAME TABLE tableClone TO tableName

于 2017-04-27T14:05:59.727 に答える