Ich habe also diese Prüftabelle (verfolgt Aktionen für jede Tabelle in meiner Datenbank):
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
und ich muss anfangen, veraltete Elemente zu archivieren. Die Tabelle ist auf ungefähr 50 Millionen Zeilen angewachsen. Der schnellste Weg, die Zeilen zu löschen, bestand darin, jeweils eine Tabelle (basierend auf tableName
) zu löschen .
Dies funktioniert ziemlich gut, aber auf einigen Tabellen, die schreiblastig sind, wird es nicht vollständig. Meine Abfrage löscht alle Elemente, denen eine delete
Aktion für eine Kombination aus tupleID und tableName zugeordnet ist:
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)
)
Ich habe dies 3 Tage lang auf meinem Server laufen lassen und es wurde für die größte Tabelle nie abgeschlossen. Die EXPLAIN-Ausgabe (wenn ich das Löschen auf Auswahl umschalte:
| 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 |
Das Löschen von 4 Millionen Zeilen sollte also nicht 3 Tage dauern, würde ich denken. Ich habe meine innodb_buffer_pool_size auf 3 GB festgelegt, und der Server ist nicht für die Verwendung von one_file_per_table festgelegt. Welche anderen Möglichkeiten kann ich die Leistung beim Löschen von InnoDB verbessern? (Ausführen von MySQL 5.1.43 unter Mac OS X)