背景信息
MySQL 版本: MySQL 5.7.20
碎片產的生原因
(1)記錄被Delete,且原空間無法複用(MySQL插入爲了提高效率直接插入末尾的);
(2)記錄被Update(通常出現在變長字段中,重新分配存儲空間),原空間無法複用;
(3)記錄插入導致頁分裂,頁的填充率降低;
碎片率高的影響
(1)浪費磁盤空間;
(2)可能導致查詢掃描的IO成本提升,效率降低;
如果表空間較小或者碎片率較小,用戶無需關注,也不建議執行回收空間碎片操作。
回收表空間碎片的三種方法
方法一: optimize table table_name
OPTIMEZE TABLE 重新組織 table 數據和相關索引數據的物理存儲,以減少訪問table的存儲空間並提高I/O效率。對每個 table 所做的確切更改取決於該 table 使用的存儲引擎。
回收碎片的常見放大是通過optimize table tablename 來重組文件,操作過程會導致該表上的寫操作無法執行(鎖表),實例負載增大,請用戶謹慎操作,如果確定需要回收,建議放在業務低峯期進行。
方法二: alter table table_name engine=INNODB
定期執行”null” ALTER TABLE 操作,會導致MySQL重建table:
ALTER TABLE tbl_name ENGINE=INNODB
還可以使用ALTER TABLE tbl_name FORCE執行重建table的”null”更改操作。
ALTER TABLE tbl_name ENGIN=INNODB和ALTER TABLE tbl_name FORCE都使用在線 DDL。
方法三: mysqldumptable、刪除table、重新載入數據
執行碎片整理操作的另一種方法是使用mysqldump將table轉儲到文本文件,刪除table,然後從轉存文件重新加載它。
拓展
(1) 頻繁的 delete 操作導致表空間碎片率增高是不可避免的;
(2) 更新包含可變長字段的數據也會導致表空間碎片率增高,那麼在表設計的時候如果可以的話,儘量使用較小的數據類型並且選擇定長的數據類型。
參考文獻
[1] MySQL 5.7 Reference Manual
[2] 阿里雲文檔
[3] MySQL 5.7 中文文檔