따라서이 감사 테이블이 있습니다 (데이터베이스의 모든 테이블에 대한 작업을 추적합니다).
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 천만 행으로 커 졌으므로 행을 삭제할 수있는 가장 빠른 방법은 한 번에 테이블을 삭제하는 것입니다 (기반 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 일 동안 내 서버에서 실행하게하고 가장 큰 테이블을 완성하지 못했습니다. Explain 출력 (삭제를 선택하여 전환하는 경우 :
| 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 |
따라서 4 백만 행을 삭제하는 데 3 일이 걸리지 않아야합니다. innodb_buffer_pool_size를 3GB로 설정했으며 서버가 one_file_per_table을 사용하도록 설정되어 있지 않습니다. InnoDB 삭제 성능을 향상시킬 수있는 다른 방법은 무엇입니까? (Mac OSX에서 MySQL 5.1.43 실행)