web-dev-qa-db-ja.com

innodbでインデックスを無効にする方法

インデックスを一時的に無効にして、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)

インデックスを無効にするにはどうすればよいですか?

一括挿入を行うときにインデックスの使用を避けるための代替手段はありますか?

どうすればプロセスをスピードアップできますか?

30
fanchyna

以下を試しましたか?

    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」を参照してください

31
lurkerbelow

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に例外をコーディングするよりもはるかに簡単です。

29
RolandoMySQLDBA

インデックスの再計算のコストを削減するには、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_pa​​cket mysql設定に依存します。

8
staabm

少し遅れましたが...何でも...ここのすべての答えを忘れて、インデックスを無効にしないでください、それらを削除するだけで、ALTER TABLE tablename DROP INDEX whatever、データを一括挿入してから、ALTER TABLE tablename ADD INDEX whateverwhatever);インデックスを再作成する時間は、インデックス付きの一括挿入の1%です。た​​とえば、400000行はインデックス付きで10分かかり、2秒なしでは...

5
KciNicK