観察#1
あなたがオフになったのに気づいたautocommit。これにより、ibdata1に大量のデータが蓄積されます。どうして?
ibdata1に保存される情報のクラスは7つ(7)です。
- InnoDBテーブルのデータページ
- InnoDBテーブルのインデックスページ
- データ辞書
- ダブルライトバッファ
- データ破損を防止するセーフティネット
- キャッシュのOSのバイパスを支援
- バッファーの挿入(セカンダリインデックスへの変更を合理化)
- ロールバックセグメント
- ログを元に戻す
- ここをクリックして、画像表示をご覧ください
ibdata1
この情報の一部は、分離レベルに応じて特定のトランザクションに表示されます。このようなアクションは、意図しない主キーロックと大量のファントムデータを生成する可能性があります。これらの2つのことが増加すると、かなりの速度低下が予想されます。
勧告:自動コミットをオンのままにしてください
観察#2
あなたはこれを持っていることがわかります:
alter table item_load disable keys;
DISABLE KEYSはInnoDBでは機能しません。その理由は次のとおりです。
- MyISAM:
DISABLE KEYSMyISAMテーブルのセカンダリインデックスの更新を単に停止します。キーを無効にしたMyISAMテーブルに一括挿入すると、PRIMARY KEYとすべての一意のインデックスの構築とともに、テーブルの読み込みが高速になります。実行するとENABLE KEYS、すべてのセカンダリインデックスがテーブル上に直線的に構築され、.MYD。
- InnoDB:InnoDBの内部図に示されているように、システムtablespaveに
ibdata1は、セカンダリインデックス挿入専用の構造があります。現時点では、MyISAMと同じインデックスを処理する規定はありません。
これを説明するために、MySQLのInnoDBテーブルでDISABLE KEYSを実行しようとする試みに注意してください
mysql> show create table webform\G
*************************** 1. row ***************************
Table: webform
Create Table: CREATE TABLE `webform` (
`nid` int(10) unsigned NOT NULL,
`confirmation` text NOT NULL,
`confirmation_format` tinyint(4) NOT NULL DEFAULT '0',
`redirect_url` varchar(255) DEFAULT '<confirmation>',
`status` tinyint(4) NOT NULL DEFAULT '1',
`block` tinyint(4) NOT NULL DEFAULT '0',
`teaser` tinyint(4) NOT NULL DEFAULT '0',
`allow_draft` tinyint(4) NOT NULL DEFAULT '0',
`submit_notice` tinyint(4) NOT NULL DEFAULT '1',
`submit_text` varchar(255) DEFAULT NULL,
`submit_limit` tinyint(4) NOT NULL DEFAULT '-1',
`submit_interval` int(11) NOT NULL DEFAULT '-1',
PRIMARY KEY (`nid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> alter table webform disable keys;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
+-------+------+-------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------------------+
| Note | 1031 | Table storage engine for 'webform' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select version();
+------------+
| version() |
+------------+
| 5.5.27-log |
+------------+
1 row in set (0.00 sec)
mysql>
観察#3
MyISAMがInnoDBよりも20倍高速にロードすることに気付きました。24〜25倍速くしたいですか?次に、次を実行します。
ALTER TABLE item_load ROW_FORMAT=Fixed;
これにより、他のDDL変更なしでINSERTの時間を20〜25%短縮できます。副作用:MyISAMテーブルはサイズが80%〜100%大きくなる可能性があり、場合によっては大きくなります。
これをInnoDBテーブルでも実行できますが、特にVARCHARフィールドが大幅に増加する場合は、ACID準拠の動作とInnoDBのMVCCがパフォーマンスのボトルネックになりibdata1ます。