Jadi saya memiliki tabel audit ini (melacak tindakan pada tabel apa pun di database saya):
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
dan saya harus mulai mengarsipkan item yang sudah ketinggalan zaman. Tabel telah berkembang menjadi sekitar 50 juta baris, jadi cara tercepat saya bisa menghapus baris adalah menghapusnya dalam satu waktu (berdasarkan pada tableName
).
Ini berfungsi cukup baik tetapi pada beberapa tabel yang berat, itu tidak akan lengkap. Kueri saya menghapus semua item yang memiliki delete
tindakan terkait pada kombinasi 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)
)
Saya membiarkan ini berjalan di server saya selama 3 hari dan tidak pernah selesai untuk tabel terbesar. Hasil penjelasan (jika saya mengganti hapus untuk memilih:
| 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 |
Jadi 4 juta baris seharusnya tidak perlu 3 hari untuk dihapus, saya pikir. Saya mengatur Innodb_buffer_pool_size saya menjadi 3GB, dan server tidak diatur untuk menggunakan one_file_per_table. Apa cara lain yang bisa saya lakukan untuk meningkatkan kinerja penghapusan InnoDB? (Menjalankan MySQL 5.1.43 di Mac OSX)