Mam tabelę InnoDB o pojemności 700 GB, do której nie zapisuję już żadnych danych (tylko czytam). Chciałbym usunąć starsze przechowywane w nim dane i odzyskać to miejsce na dysku (gdy mi się kończy). Usunięcie części jest dość łatwe, ponieważ mam indeks główny auto-inc, dzięki czemu mogę po prostu iterować fragmenty, używając go i usuwać wiersze, ale to nie przywróci mi miejsca. Zakładam, że OPTIMIZE TABLE
tak, ale może to potrwać wiecznie na stole o pojemności 700 GB, więc czy jest inna opcja, którą przeoczam?
Edytuj przez RolandoMySQLDBA
Zakładając, że twoja tabela jest mydb.mytable
, uruchom następującą kwerendę i opublikuj ją tutaj, aby określić miejsce na dysku potrzebne do zmniejszenia tabeli:
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;
Musimy także zobaczyć strukturę tabeli, jeśli jest to dozwolone.
Edytuj przez Noam
To jest wynik zapytania:
datsize ndxsize tblsize
682,51 47,57 730.08
To jest struktura tabeli ( 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;
(jeśli masz na to miejsce). Większość jest zadowolona ze swoich bardzo szybkich dysków SSD i nie będzie się już martwić.