エンジンタイプに基づいてアプローチを選択する必要があります...最適化
最近、データを挿入するさまざまな方法を比較するベンチマークを実行し、挿入前からすべてのインデックスが完全に復元されるまでの時間を測定しました。空のテーブルにありましたが、最大1,000万行を使用しました。
LOAD DATA INFILE
を使用したMyISAM およびALTER TABLE ... ENABLE/DISABLE KEYS
私たちのテストで勝ちました(Windows 7システムでは、MySQL 5.5.27-現在、Linuxシステムで試しています)。
ENABLEおよびDISABLEKEYSはInnoDBでは機能せず、MyISAMのみです。 InnoDBの場合、SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
データに重複が含まれていないことが確実な場合(1
に設定することを忘れないでください アップロードが完了した後)
OPTIMIZE TABLE
は必要ないと思います 一括挿入後-MySQL行は挿入順に並べられ、とにかくインデックスが再構築されます。一括挿入を行うことによる「余分な断片化」はありません。
事実に誤りがあった場合は、遠慮なくコメントしてください。
更新: 最近の完全なテスト結果によると、DISABLE/ENABLEキーへのアドバイスは間違っています。
同僚は、プログラムに複数の異なるテストを実行させました-InnoDB / MyISAMが事前に入力されて空になっているテーブル、LOAD DATA LOCAL
を使用した選択と挿入の速度 、INSERT INTO
、REPLACE INTO
およびUPDATE
、「密な」テーブルと「断片化された」テーブル(方法はよくわかりませんが、DELETE FROM ... ORDER BY RAND() LIMIT ...
の行に沿っていたと思います。 シードが固定されているため、引き続き比較可能です)、有効化およびダイアサブル化されたインデックス。
WindowsとLinuxで多くの異なるMySQLバージョン(5.0.27、5.0.96、5.1.something、5.5.27、5.6.2)でテストしました(ただし、両方のOSで同じバージョンではありません)。 MyISAMは、テーブルが空の場合にのみ勝ちました。 InnoDBは、データがすでに存在する場合は高速であり、一般的にパフォーマンスが向上しました(hdd-spaceを除く-MyISAMはディスク上で小さい)。
それでも、それを実際に活用するには、バージョン、構成設定、および忍耐力を変えて、特に奇妙な不整合に関して自分でテストする必要があります(5.0.97は同じ構成の5.5.27よりもはるかに高速でした)。 'まだ原因を探しています)。 私たちが見つけたのは そのDISABLE KEYS
およびENABLE KEYS
空のテーブルから始めないと、価値がなく、時には有害です。