發現MySQL 中一個表xxx只有6條數據,但idb空間卻占了40G。
查看是否獨立表空間:
mysql> show variables like 'innodb_file_per_table';
原因:MySQL執行命令delete語句時,如果包括where條件,並不會真正的把數據從表中刪除,而是將數據轉換成了碎片,通過下面的命令可以查看表中的碎片數量和索引等信息:
mysql> show table status like 'table_name';
查詢結果中:
Index_length 代表索引的數量
Data_free 代表碎片數量
然后執行下面命令進行優化整理:
mysql > optimize table table_name;
再次查看idb文件已經很小了
這里mysql給的提示是
Note>> Table does not support optimize, doing recreate + analyze instead
Status>> OK
也就是說 optimize table 對於innodb來說,無法作為a single operation,實際的操作是:
ALTER TABLE table_name ENGINE=InnoDB;
ANALYZE TABLE table_name;
MySQL5.7已經推薦對於InnoDB的table使用 alter table table_name engine=innodb; 語句的方式來進行表碎片優化。
注:optimize會進行鎖表操作,所以進行優化時要避開表數據操作時間,避免影響正常業務的進行。