Vì vậy, tôi có bảng kiểm toán này (theo dõi các hành động trên bất kỳ bảng nào trong cơ sở dữ liệu của tôi):
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
và tôi cần bắt đầu lưu trữ các mục đã lỗi thời. Bảng đã tăng lên khoảng 50 triệu hàng, vì vậy cách nhanh nhất tôi có thể xóa các hàng là xóa một bảng tại một thời điểm (dựa trên tableName
).
Điều này hoạt động khá tốt nhưng trên một số bảng nặng, nó sẽ không hoàn thành. Truy vấn của tôi xóa tất cả các mục có delete
hành động liên quan trên kết hợp 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)
)
Tôi để nó chạy trên máy chủ của tôi trong 3 ngày và nó không bao giờ hoàn thành cho bảng lớn nhất. Đầu ra giải thích (nếu tôi chuyển sang xóa để chọn:
| 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 |
Vì vậy, 4 triệu hàng không nên mất 3 ngày để xóa, tôi nghĩ vậy. Tôi có innodb_buffer_pool_size được đặt thành 3GB và máy chủ không được đặt để sử dụng one_file_per_table. Những cách nào khác tôi có thể cải thiện hiệu suất xóa InnoDB? (Chạy MySQL 5.1.43 trên Mac OSX)