私は約1000万行を含むかなり大きなInnoDBテーブルを持っています(そして数えると、そのサイズの20倍になると予想されます)。各行はそれほど大きくはありませんが(平均で131 B)、時々それらのチャンクを削除する必要があり、それには時間がかかります。これはテーブル構造です:
CREATE TABLE `problematic_table` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`taxid` int(10) unsigned NOT NULL,
`blastdb_path` varchar(255) NOT NULL,
`query` char(32) NOT NULL,
`target` int(10) unsigned NOT NULL,
`score` double NOT NULL,
`evalue` varchar(100) NOT NULL,
`log_evalue` double NOT NULL DEFAULT '-999',
`start` int(10) unsigned DEFAULT NULL,
`end` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `taxid` (`taxid`),
KEY `query` (`query`),
KEY `target` (`target`),
KEY `log_evalue` (`log_evalue`)
) ENGINE=InnoDB AUTO_INCREMENT=7888676 DEFAULT CHARSET=latin1;
テーブルから大きなチャンクを削除するクエリは、次のようになります。
DELETE FROM problematic_table WHERE problematic_table.taxid = '57';
このようなクエリは、完了するのにほぼ1時間かかりました。インデックス書き換えのオーバーヘッドにより、これらのクエリが非常に遅くなることが想像できます。
既存のデータベースで実行されるアプリケーションを開発しています。サーバー変数への変更を必須にしない限り(私はそうしたくない)、サーバー変数を制御できない可能性が高いので、それらを変更する提案はほとんど価値がありません。
INSERT ... SELECT
削除したくない行を一時テーブルに入れて残りを削除しようとしましたが、削除する行と保持する行の比率が維持する方向にシフトするため、これはもはや有用な解決策ではありません。 。
これは、将来頻繁にINSERT
sとsが表示される可能性があるテーブルですが、sは表示されません。基本的に、コンテンツの一部を時々削除する必要があるのは、ロギングおよび参照テーブルです。SELECT
UPDATE
このテーブルのインデックスの長さを制限することで、インデックスを改善できますか?DISABLE KEYS
トランザクション中にサポートするMyISAMヘルプに切り替えますか?DELETE
パフォーマンスを改善するために他に何を試みることができますか?
編集:そのような削除の1つは、約100万行のオーダーになります。