MySQL 碎片管理

背景信息

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 中文文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章