Bu denetim tablosu var (veritabanımdaki herhangi bir tabloda eylemleri izler):
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
ve eski öğeleri arşivlemeye başlamam gerekiyor. Tablo yaklaşık 50 milyon satıra ulaştı, bu yüzden satırları silmenin en hızlı yolu bir kerede bir tabloyu silmekti (dayalı tableName
).
Bu oldukça iyi çalışıyor, ancak yazma ağır olan bazı tablolarda tamamlanmayacak. delete
Sorgum, tupleID / tableName birleşiminde ilişkili eylemi olan tüm öğeleri siler :
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)
)
Bu sunucum üzerinde 3 gün boyunca çalışmasına izin ve asla en büyük tablo için tamamlandı. Açıklama çıkışı (silme işlemini seçmek için değiştirirsem:
| 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 |
Yani 4 milyon satırın silinmesi 3 gün sürmemeli diye düşünüyorum. Benim innodb_buffer_pool_size 3GB olarak ayarlanmış ve sunucu one_file_per_table kullanmak için ayarlanmamış. InnoDB silme performansını nasıl artırabilirim? (Mac OSX'te MySQL 5.1.43'ü çalıştırma)