5

状況を整理させてください。適度な幅の MyISAM テーブルに適度な数の行 (1 日あたり約 10 ~ 20M) を挿入しようとしています。

+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| blah1        | varchar(255) | NO   | PRI |         |       | 
| blah2        | varchar(255) | NO   | PRI |         |       | 
| blah3        | varchar(5)   | NO   | PRI |         |       | 
| blah4        | varchar(5)   | NO   | PRI |         |       | 
| blah5        | varchar(2)   | NO   | PRI |         |       | 
| blah6        | varchar(2)   | NO   | PRI |         |       | 
| blah7        | date         | NO   | PRI |         |       | 
| blah8        | smallint(6)  | NO   | PRI |         |       | 
| blah9        | varchar(255) | NO   | PRI |         |       | 
| blah10       | bigint(20)   | YES  |     | NULL    |       | 
+--------------+--------------+------+-----+---------+-------+

その途方もない主キー以外の唯一のインデックスは、blah7、日付フィールドにあります。私たちは LOAD DATA INFILE を使用していますが、データのロードに約 2 時間かかるという、非常にひどいパフォーマンスだと思います。私は、LOAD DATA INFILE がそれより桁違いに速いと信じるようになりました。

興味深いことに、データをバッチ処理するために LOAD DATA INFILE も使用する脂肪の少ないテーブル (5 ~ 6 フィールド) があり、それらのテーブルのパフォーマンスが大幅に向上しています。レコードの数がかなり少ないため、大きなテーブルをロードするときにバッファ サイズの制限に達していて、ディスクに移動する必要があると思います (実際、ディスクに移動する以外に何が必要でしょうか)。そのような遅いロード時間を説明しますか?)。

...それが私の質問につながります。LOAD DATA INFILE コマンドを処理する際に最も重要な my.cnf 設定は何ですか?

4

3 に答える 3

5

一般に、インデックスに挿入するとパフォーマンスが低下します。データを挿入する前にインデックスを削除し、挿入後にインデックスを再作成する方がよい場合があります。

http://forum.percona.com/s/m/983/から:

通常、MySQLはMyISAMテーブルへのデータの読み込みがかなり高速ですが、例外があります。これは、並べ替えによってインデックスを再構築できず、代わりに行ごとにインデックスを構築する場合です。設定が間違っている(つまり、myisam_max_sort_file_sizeまたはmyisam_max_extra_sort_file_sizeが小さすぎる)ことが原因で発生している可能性があります。または、PRIMARYまたはUNIQUEインデックスが大きい(メモリに収まらない)場合は、最適化が不足している可能性があります。

http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/およびhttp://www.linuxtopia.org/online_books/database_guides/mysql_5も確認してください。 1_database_reference_guide/insert-speed.html

于 2009-05-06T04:07:38.603 に答える
1

テーブルが MyISam で、データが空でないテーブルに追加されている場合、bulk_insert_buffer_size が問題になります

MyISAM は特別なツリーのようなキャッシュを使用して、空でないテーブルにデータを追加するときに LOAD DATA INFILE の一括挿入を高速化します。BULK_INSERT_BUFFER_SIZE 変数は、キャッシュ ツリーのサイズをスレッドあたりのバイト単位で制限します。0 に設定すると、この最適化が無効になります。デフォルト値は 8MB です。最大値は 4GB です。

空でないテーブルにデータを追加する場合、bulk_insert_buffer_size 変数を調整すると、データの挿入が高速になります。通常、挿入するデータが 10k 行を超えると改善が見られます。しかし、何が正しい値かを言うのは難しいので、増分バッファー サイズ値を試してみてください。

また、次の変数も設定すると、パフォーマンスの向上がより明確になります。

  • MYISAM_SORT_BUFFER_SIZE
  • KEY_BUFFER_SIZE

次の alter table コマンドを使用してデータをロードする前に、インデックスを無効にすることも検討する必要があります。

alter table t disable keys;
于 2012-10-01T22:33:37.120 に答える