Tôi có một bảng InnoDB 700GB mà tôi không ghi thêm bất kỳ dữ liệu nào (chỉ đọc). Tôi muốn xóa dữ liệu cũ hơn và giữ lại không gian đĩa đó (vì tôi sắp hết dữ liệu). Phần xóa khá dễ dàng, vì tôi có một chỉ mục chính tự động, vì vậy tôi chỉ có thể lặp lại trong các khối bằng cách sử dụng nó và xóa các hàng, nhưng điều đó sẽ không đưa tôi trở lại không gian. Tôi giả sử OPTIMIZE TABLE
sẽ nhưng điều đó có thể mất mãi mãi trên một bảng 700 GB, vậy có lựa chọn nào khác mà tôi đang xem không?
Chỉnh sửa bởi RolandoMySQLDBA
Giả sử bảng của bạn là mydb.mytable
, vui lòng chạy truy vấn sau và đăng nó ở đây để bạn có thể xác định không gian đĩa cần thiết cho độ co của bảng:
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;
Chúng ta cũng cần xem cấu trúc bảng, nếu được phép.
Chỉnh sửa bởi Noam
Đây là đầu ra của truy vấn:
datsize ndxsize tblsize
682,51 47,57 730,08
Đây là cấu trúc bảng ( 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;
(nếu bạn có phòng để làm điều đó). Hầu hết chỉ hài lòng với ổ SSD rất nhanh của họ và sẽ không còn lo lắng nữa.