随着業務的發展,數據庫數據規模不斷增加,我們就要對數據庫容量進行擴容,RDS 一般支持在線擴容,但是數據庫成本還是比較高的,一般我們需要分析一下數據的增長,并确認數據的保留周期。如果有些數據不需要一直保留,例如保留 3 個月就可以了,那麼,我們就可以對這部分數據進行備份,然後删除這部分數據。下面做一個測試。
創建表創建 test 測試表,包含三個字段,兩個二級索引。
CREATE TABLE `test` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`), KEY `b` (`b`));
然後查看一下,數據文件的大小,如下圖:

查詢一下 MySQL 提供的統計信息,命令及結果如下:
SELECT
CONCAT( table_schema, '.', table_name ) AS 'Table Name',
CONCAT( ROUND( table_rows / 1000, 4 ), 'K' ) AS 'Number of Rows',
CONCAT( ROUND( data_length /( 1024 ), 4 ), 'K' ) AS 'Data Size',
CONCAT( ROUND( index_length /( 1024 ), 4 ), 'K' ) AS 'Index Size',
CONCAT( ROUND(( data_length index_length )/( 1024 ), 4 ), 'K' ) AS 'Total'
FROM
information_schema.TABLES
WHERE
table_schema LIKE 'mysql_study' and table_name like 'test';

現在我們往測試表 test 中,插入 10 萬條數據。
delimiter ;;
create procedure idata()
begin
declare i int;
set i=1;
while(i<=10000)do
insert into test values(i, i, i);
set i=i 1;
end while;
end;;
delimiter ;
call idata();
插入 10 萬數據後,文件占用的大小如下圖:


Number of Rows 為 9.98K,不是 10 K。information_schema.TABLES 中數據為統計值,存在偏差。
删除數據我們嘗試使用 delete 删除 test 表中數據。
delete from test;
删除後,數據文件大小如下圖:

由上圖可以發現,文件沒有變小,統計信息如下圖,它發生了變化。

現在我們嘗試重建表,使用下面的命令
alter table test engine=InnoDB;
重建表後,數據庫文件大小如下圖:

由上圖可以發現,文件變小了,恢複到,表新建時的大小,達到了我們縮減表空間的目的。 下圖是此時的 MySQL 的統計信息。

1、information_schema.TABLES 數據為統計值;
2、表空間占用要看實際文件大小;
3、重建表可以縮減表空間占用。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!