インデックスを一時的に無効にして、InnoDBテーブルでの一括挿入を高速化しようとしています。
ALTER TABLE mytable DISABLE KEYS;
しかし、それは警告を与えます:
+-------+------+-------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------------------+
| Note | 1031 | Table storage engine for 'mytable' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)
インデックスを無効にするにはどうすればよいですか?
一括挿入を行うときにインデックスの使用を避けるための代替手段はありますか?
どうすればプロセスをスピードアップできますか?
以下を試しましたか?
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
MySQLのリファレンスから https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html
セクション「Bulk Data Loading Tips」を参照してください
InnoDBテーブルでDISABLE KEYS
を実行できない非常に良い理由があります。 InnoDBはそれを使用するように設計されておらず、MyISAMは使用されています。
実際、mysqldumpをリロードすると、次のようになります。
書き込みロックが続くMyISAMテーブルのCREATE TABLE
が表示されます。
すべての一括挿入が実行される前に、ALTER TABLE ... DISABLE KEYS
の呼び出しが行われます。
これにより、MyISAMテーブルのセカンダリインデックスがオフになります。
次に、一括挿入が行われます。これが行われている間、プライマリキーとMyISAMテーブルのすべてのユニークキーは無効になります。 UNLOCK TABLEs
の前に、すべての一意でないインデックスを線形に再構築するためにALTER TABLE ... ENABLE KEYS
の呼び出しが行われます。
IMHOこの操作はInnoDB Storage Engineにコード化されませんでした。これは、一意でないインデックスのすべてのキーに gen_clust_index (別名Clustered Index)からのプライマリキーエントリが付いているためです。一意でないインデックスの構築には、一意の各キーを取得して一意でないキーにアタッチするためにO(n log n)の実行時間が必要になるため、これは非常に高価な操作になります。
これに照らして、InnoDBテーブルにDISABLE KEYS/ENABLE KEYS
を試みることに関する警告を投稿することは、MyISAM以外のストレージエンジンが関係する特別な場合にmysqldumpに例外をコーディングするよりもはるかに簡単です。
インデックスの再計算のコストを削減するには、DATA INFILEまたはMysql Multi Row Insertsを使用してデータを挿入する必要があります。
INSERT INTO tbl_name(a、b、c)VALUES(1,2,3)、(4,5,6)、(7,8,9);
->したがって、1つのステートメントで複数の行を挿入します。
1つのステートメントで挿入できる行数は、 max_allowed_packet mysql設定に依存します。
少し遅れましたが...何でも...ここのすべての答えを忘れて、インデックスを無効にしないでください、それらを削除するだけで、ALTER TABLE tablename DROP INDEX whatever
、データを一括挿入してから、ALTER TABLE tablename ADD INDEX whatever
(whatever
);インデックスを再作成する時間は、インデックス付きの一括挿入の1%です。たとえば、400000行はインデックス付きで10分かかり、2秒なしでは...