因此,我有此审核表(跟踪数据库中任何表上的操作):
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
并且我需要开始存档过时的项目。该表已增长到约5000万行,因此删除行的最快方法是一次删除一个表(基于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)