Ich habe eine InnoDB-Tabelle mit 700 GB, in die ich keine Daten mehr schreibe (nur lesen). Ich möchte die älteren darin enthaltenen Daten löschen und den Speicherplatz zurückfordern (da mir der Speicherplatz ausgeht). Der Lösch-Teil ist ziemlich einfach, da ich einen Auto-Inc-Primärindex habe, mit dem ich einfach in Stücken iterieren und die Zeilen löschen kann, aber das bringt mir nicht den Platz zurück. Ich OPTIMIZE TABLE
gehe davon aus , dass dies bei einem 700-GB-Tisch jedoch für immer dauern könnte. Gibt es also eine andere Option, die ich übersehen habe?
Edit von RolandoMySQLDBA
Angenommen, Ihre Tabelle ist mydb.mytable
, führen Sie die folgende Abfrage aus und veröffentlichen Sie sie hier, damit Sie den für die Schrumpfung der Tabelle erforderlichen Speicherplatz bestimmen können:
SELECT
FORMAT(dat/POWER(1024,3),2) datsize,
FORMAT(ndx/POWER(1024,3),2) ndxsize,
FORMAT((dat+ndx)/POWER(1024,3),2) tblsize
FROM (SELECT data_length dat,index_length ndx
FROM information_schema.tables WHERE
table_schema='mydb' AND table_name='mytable') A;
Wir müssen auch die Tabellenstruktur sehen, wenn dies erlaubt ist.
Edit von Noam
Dies ist die Ausgabe der Abfrage:
datsize ndxsize tblsize
682.51 47.57 730.08
Dies ist die Tabellenstruktur ( SHOW CREATE TABLE
)
`CREATE TABLE `mybigtable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`created_at` datetime NOT NULL,
`tid` bigint(20) NOT NULL,
`text` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`ft` tinyint(1) NOT NULL,
`irtsd` bigint(20) NOT NULL,
`irtuid` int(11) NOT NULL,
`rc` int(11) NOT NULL,
`r` tinyint(1) NOT NULL,
`e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `timezone` varchar(5) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uid_tid` (`uid`,`tid`)) ENGINE=InnoDB AUTO_INCREMENT=2006963844 DEFAULT CHARSET=utf8`
ALTER TABLE ... ENGINE=InnoDB;
(sofern Sie den Raum dazu haben). Die meisten sind nur mit ihren sehr schnellen SSDs zufrieden und würden sich keine Sorgen mehr machen.