Ho una tabella InnoDB da 700 GB a cui non sto scrivendo altri dati (solo lettura). Vorrei eliminare i dati più vecchi in suo possesso e recuperare lo spazio su disco (mentre lo sto esaurendo). La parte di eliminazione è piuttosto semplice, perché ho un indice primario auto-inc, quindi posso solo iterare in blocchi usando esso, ed eliminare le righe, ma questo non mi restituirà lo spazio. Suppongo che lo OPTIMIZE TABLE
farà, ma che potrebbe richiedere un'eternità su un tavolo da 700 GB, quindi c'è un'altra opzione che sto trascurando?
Modifica di RolandoMySQLDBA
Supponendo che la tabella sia mydb.mytable
, eseguire la query seguente e pubblicarla qui in modo da poter determinare lo spazio su disco necessario per la riduzione della tabella:
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;
Dobbiamo anche vedere la struttura della tabella, se consentita.
Modifica di Noam
Questo è l'output della query:
datsize ndxsize tblsize
682.51 47.57 730.08
Questa è la struttura della tabella ( 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;
(se hai la stanza per farlo). Molti sono semplicemente soddisfatti dei loro SSD molto veloci e non si preoccupano più.