У меня есть таблица InnoDB на 700 ГБ, в которую я больше не записываю данные (только чтение). Я хотел бы удалить старые данные, которые он хранит, и освободить это дисковое пространство (так как у меня заканчивается). Часть удаления довольно проста, потому что у меня есть первичный индекс auto-inc, поэтому я могу просто перебирать его по частям и удалять строки, но это не вернет мне пространство. Я предполагаю, что OPTIMIZE TABLE
будет, но это может занять вечность на столе 700 ГБ, так есть ли другой вариант, который я пропускаю?
Редактировать 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;
Нам также нужно увидеть структуру таблицы, если это разрешено.
Редактировать Ноам
Это результат запроса:
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;
(если у вас есть место для этого). Большинство просто довольны своими очень быстрыми твердотельными накопителями и больше не будут беспокоиться.