Saya memiliki tabel InnoDB 700GB yang saya tidak akan menulis data lagi (hanya membaca). Saya ingin menghapus data lama yang dipegangnya dan mengambil kembali ruang disk tersebut (karena saya kehabisan). Bagian delete cukup mudah, karena saya memiliki indeks primer auto-inc jadi saya bisa saja mengulanginya menggunakan potongan, dan menghapus baris, tetapi itu tidak akan membawa saya kembali ke ruang kosong. Saya berasumsi OPTIMIZE TABLE
akan tetapi mungkin butuh selamanya di atas meja 700GB, jadi apakah ada opsi lain yang saya abaikan?
Edit oleh RolandoMySQLDBA
Dengan asumsi tabel Anda adalah mydb.mytable
, jalankan kueri berikut dan posting di sini sehingga Anda dapat menentukan ruang disk yang diperlukan untuk penyusutan tabel:
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;
Kita juga perlu melihat struktur tabel, jika diizinkan.
Edit oleh Noam
Ini adalah output dari query:
datsize ndxsize tblsize
682.51 47.57 730.08
Ini adalah struktur tabel ( 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;
(jika Anda punya ruang untuk melakukannya). Kebanyakan hanya puas dengan SSD mereka yang sangat cepat dan tidak akan lagi khawatir.