我有一个700GB的InnoDB表,我不会再写入任何数据(只能读取)。我想删除它保存的旧数据并回收该磁盘空间(因为我快用完了)。删除部分非常简单,因为我有一个自动增量主索引,因此我可以使用它对块进行迭代,然后删除行,但这不会让我退缩。我认为OPTIMIZE TABLE
会,但是在700GB的桌子上可能会永远占用,所以我有没有忽略其他选择?
由RolandoMySQLDBA编辑
假设您的表是mydb.mytable
,请运行以下查询并将其发布在此处,以便您确定表收缩所需的磁盘空间:
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;
如果允许,我们还需要查看表结构。
由Noam编辑
这是查询的输出:
datsize ndxsize tblsize
682.51 47.57 730.08
这是表格结构(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;
(如果有足够的空间进行碎片整理)对表进行碎片整理。大多数人只对他们的高速SSD感到满意,不再担心。