700GBのInnoDBテーブルがあり、それ以上データを書き込みません(読み取りのみ)。保持している古いデータを削除し、そのディスク領域を再利用します(不足しているため)。削除部分は非常に簡単です。auto-incプライマリインデックスがあるので、それを使用してチャンク単位で繰り返し、行を削除できますが、スペースを取り戻すことはできません。私は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;
許可されている場合は、テーブル構造も確認する必要があります。
ノーム編集
これはクエリの出力です:
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に満足しているだけで、心配する必要はありません。