Eu tenho uma tabela InnoDB de 700 GB na qual não estou gravando mais dados (apenas lendo). Gostaria de excluir os dados mais antigos que ele contém e recuperar esse espaço em disco (já que estou ficando sem). A parte de exclusão é bastante fácil, porque eu tenho um índice primário de auto-inc. Para que eu possa iterar em pedaços usando-o e excluir as linhas, mas isso não me trará de volta o espaço. Suponho que OPTIMIZE TABLE
vai, mas isso pode levar uma eternidade em uma mesa de 700 GB, então existe outra opção que estou ignorando?
Editado por RolandoMySQLDBA
Supondo que sua tabela seja mydb.mytable
, execute a seguinte consulta e publique-a aqui para poder determinar o espaço em disco necessário para o encolhimento da tabela:
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;
Também precisamos ver a estrutura da tabela, se permitido.
Editar por Noam
Esta é a saída da consulta:
datsize ndxsize tblsize
682,51 47,57 730,08
Esta é a estrutura da tabela ( 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 você tiver espaço para isso). A maioria está satisfeita com seus SSDs muito rápidos e não se preocupa mais.