私は大学院生で、OLAPを研究しています。そのため、初期ロードでInnoDB(MySQL 5.5)にデータをより速く挿入したいと考えています。この環境では、唯一のユーザーは私です。挿入速度をもっと緩やかに設定できると思いますが、現在は以下のテクニックを使っています。
log_bin
skip-innodb-doublewrite
transaction_isolation
をREAD-COMMITTED
またはREAD-UNCOMMITTED
に設定します(実際にはREAD-COMMITED
)innodb_flush_log_at_trx_commit
を0
または2
に設定します(実際には0
)innodb_buffer_pool_size
を5GBに設定します(システムには6GBのRAMがあります)InnoDBに高速に挿入するためのテクニックは他にありますか?また、innodb_io_read_thread
とinnodb_io_write_thread
を変更する必要がありますか?さらに詳しい情報が必要な場合はお知らせください。
マシンに複数のコアがある場合は、次の値を増やす必要があります。
[mysqld]
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
これは何?
システムテーブルスペース(ibdata1)からデータとインデックスを分離するには、InnoDBの完全な再構築を実行する必要があります。複雑に聞こえますが、非常に簡単です。私はこれについて DBA StackExchange(Aug 29、2012) と StackOverflow(2010年10月29日) 。基本的な手順は
SET GLOBAL innodb_fast_shutdown = 0;
を実行しますservice mysql stop
ibdata1
ib_logfile0
ib_logfile1
service mysql start
service mysql start
を実行する前に、この行をmy.cnf
に追加します
innodb_open_files=32768
これにより、個々のテーブルに専用のファイルハンドルができます。デフォルトは300です。 ファイルハンドルはキャッシュされることがわかっています。これを非常に高く設定し、すぐに上限に達すると、速度が低下します 。少数のテーブルで作業している場合、これは当てはまりません。
InnoDBへのデータの一括読み込み専用の document 全体があります。主なポイント:
SET autocommit=0;...sql import;COMMIT;
外部チェックと一意チェックを無効にします(すべてのインデックスを完全に無効にすることはできません)。
SET unique_checks=0;
SET foreign_key_checks=0;
3番目の方法は役立つ場合とそうでない場合があるので、そのリンクを読んで、最初にデータをロードする方法を確認することをお勧めします。たとえば、ロードを複数の挿入に分割して同時に実行する場合、値を2に設定することは間違いなく役立ちます。1つの大きな複数行の挿入を実行している場合、(もしあるとしても)多くのことは実行されません。助けて。
この最初の挿入でバイナリログをオンにしているので、自動インクリメント数のギャップを気にする必要はありません(同時挿入を行う場合)。
次の方法を使用して、挿入を高速化できます。
INSERT
ステートメントを複数のVALUES
リストと共に使用して、一度に複数の行を挿入します。これは、個別の単一行のINSERT
ステートメントを使用するよりもかなり高速(場合によっては何倍も高速)です。空でないテーブルにデータを追加する場合は、bulk_insert_buffer_size変数を調整して、データ挿入をさらに高速にすることができます。LOAD DATA INFILE
を使用します。これは通常、INSERT
ステートメントを使用するよりも20倍高速です。 参照プランA:「バッチ」INSERT-INSERTステートメントごとに複数の行。ステートメントごとに約1000行を提案します。 autocommit = on、明示的なBEGIN ... COMMITなし
プランB:データの読み込み
一度に挿入する行が多すぎる場合、クラッシュが発生した場合にInnoDBが挿入をロールバックできるようにするには、さらに多くの作業を行う必要があります。このため、セット全体を1つのトランザクションに入れるautocommit = offには同意しません。
行のセット全体のLOAD DATAでも同じ問題が発生する可能性がありますが、非常に高速です。
buffer_pool = 6Gのうち5Gは大きすぎる寸前です。スワッピングがあると、パフォーマンスが低下します。
パーティション設定を行うと、おそらく速度が遅くなります。
SHOW CREATE TABLE-セカンダリキーは深刻なハンディキャップになる可能性があります。
InnoDBを使用していますか?またはXtraDB?