挿入の mysql パフォーマンスを改善する方法を研究していました。
シナリオについては、忙しい日に、3 秒ごとに大きなテーブルで約 3000 行、中規模のテーブルでさらに 100 行、小さなテーブルで約 30 行を同時に処理します。これは 24 時間継続する必要があり、30.000 ~ 40.000 行のみの重要な部分を選択してから、3 つのテーブルすべてをフラッシュします。
だから、私はmysql 5.5.29を使用しています。すべてのテーブルは innodb を使用しており、インデックスと主キーはほとんどありません。
質問については、これらの挿入にメモリ エンジン テーブルを使用し、それらをプライマリ テーブルに移動することについてのコメントを見ました。
「LOCK TABLE を使用すると .. WRITE を使用すると挿入が高速化される可能性がありますが、行をロードするだけでなく処理するときに、リーダーがロックアウトされます。主キーの選択 (0 秒近くかかるはずです) は、私のローダーは 1000 行のバッチの読み込みでビジーです。
非常に良い回避策は、新しい行を一時テーブルに配置し、そのテーブルをときどき単一のトランザクションでフラッシュすることです。これにより、すべてのチェックと変換が一時テーブルで既に行われているため、挿入が非常に高速になります。
CREATE TEMPORARY TABLE ..._temp (....) ENGINE=MEMORY;
-- Loop from here --
DELETE FROM .._temp;
INSERT INTO .._temp ... VALUES (...);
INSERT INTO .._temp ... VALUES (...);
LOCK TABLE ... WRITE, ..._temp READ;
INSERT INTO ... SELECT * FROM ..._temp;
UNLOCK TABLES;
-- Repeat until done --
DROP TABLE ..._temp;
私のシステムで見たのは、テーブルをロックするときとほぼ同じ速度で INSERT が実行されることですが、ローダーが実行されているとき、クライアントはパフォーマンスの低下にまったく気付かないということです。」
その場合、メモリエンジンを使用するのは理にかなっていますか? 行にアクセスする必要がある場合にテーブルロックを回避するために innodb を使用する必要がありますか、それとも速度のために myisam を使用する必要がありますか?