だから私はこの監査テーブルを持っています(私のデータベース内の任意のテーブルでのアクションを追跡します):
CREATE TABLE `track_table` (
`id` int(16) unsigned NOT NULL,
`userID` smallint(16) unsigned NOT NULL,
`tableName` varchar(255) NOT NULL DEFAULT '',
`tupleID` int(16) unsigned NOT NULL,
`date_insert` datetime NOT NULL,
`action` char(12) NOT NULL DEFAULT '',
`className` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `userID` (`userID`),
KEY `tableID` (`tableName`,`tupleID`,`date_insert`),
KEY `actionDate` (`action`,`date_insert`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
古くなったアイテムのアーカイブを開始する必要があります。テーブルが約5,000万行に増えたので、行を削除する最も速い方法は、一度に1つのテーブルを削除することでした(に基づくtableName
)。
これはかなりうまく機能しますが、書き込みが多いテーブルの一部では完了しません。私のクエリdelete
は、tupleID / tableNameの組み合わせに関連付けられたアクションを持つすべてのアイテムを削除します。
DELETE FROM track_table WHERE tableName='someTable' AND tupleID IN (
SELECT DISTINCT tupleID FROM track_table
WHERE tableName='someTable' AND action='DELETE' AND date_insert < DATE_SUB(CURDATE(), INTERVAL 30 day)
)
私はこれを私のサーバーで3日間実行しましたが、最大のテーブルでは完了しませんでした。説明出力(削除を選択に切り替えた場合:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | PRIMARY | track_table | ref | tableID | tableID | 257 | const | 3941832 | Using where |
| 2 | DEPENDENT SUBQUERY | track_table | ref | tableID,actionDate | tableID | 261 | const,func | 1 | Using where; Using temporary |
したがって、400万行を削除するのに3日はかかりません。私のinnodb_buffer_pool_sizeを3GBに設定していますが、サーバーがone_file_per_tableを使用するように設定されていません。InnoDBの削除パフォーマンスを向上させるには、他にどのような方法がありますか?(Mac OSXでMySQL 5.1.43を実行)