MySQL 可以壓縮或回收磁碟空間嗎

qing_yun發表於2023-01-11

MYSQL 的資料庫中的表,在使用中因為插入,刪除或者UPDATE 等會產生頁面的碎片,而碎片多了就會產生頁面中不可用的資料空白,空白多了就會導致實際上儲存的資料和在檔案上生成的資料檔案之間的差異,導致磁碟空間浪費的問題。

MYSQL 的資料庫中表支援單表單檔案的特性,而我們的optimize table 主要的面對表在大量UPDATE 或者刪除資料後的最佳化工作。

首先我們可以確認optimize table 對於資料庫是有必要操作的,尤其針對業務中對錶操作中充斥了大量的insert ,update,delete 等操作,使用這個命令可以讓資料庫重新的組織資料和重組,並且已經可以被釋放的磁碟空間可以在釋放給作業系統。

在很多情況下,資料表本身可能根本不大,但是在佔用作業系統層面上,佔用的資料量很大。

在這樣的情況下,我們就需要針對這樣的表進行清理的工作了,optimize table 主要面對在資料表中存在的varchar ,varbinary,blob, text 等大量應用在表中,並且被清理後的情況也適合使用 optimize table.

為什麼要進行表的收縮的工作,主要的原因如下

1 表佔用的資料空間,比實際的資料應該佔用的表空間要大

2 表在全表掃描的過程中,比碎片少的資料表,掃描的時間明顯長,尤其在進行如 count 操作等

3 影響資料插入的效能,因為資料在碎片中插入資料的效能明顯比在沒有碎片的頁面中插入資料的速度要快。

針對INNODB 的表,我們在操作中會直接得到如下的資訊

這是因為 optimize table 在INNODB表中的操作轉變為

alter table table_name engine = 'innodb';

analyze table table_name;

或者

alter table table_name force;

analyze table table_name;

這個操作中會鎖表,產生一個新的表,並將資料複製到新表中,在將老表清理掉,新表改為原來的表名。

要進行這個操作,需要如下的一些工作

在資料庫安裝之初,我們們的 innodb_file_per_table = 1

同時需要對錶的data_free 進行,檢查,如果 data free 比較大的情況下對比實際的表,就說明表中的碎片是比較大,需要進行資料的整理。

另一種對錶得資料壓縮的方式也可以將表進行處理,直接將表的資料格式轉變為 compressed ,透過這樣的方式對於一些 varchar, text blob 等欄位型別較多的表進行空間方面的縮減。但 如果表中的欄位都是整形或數值型的狀態,那麼表基本上就不會被壓縮。

來自 “ AustinDatabases ”, 原文作者:carol11;原文連結:https://mp.weixin.qq.com/s/QO8MSMGOqbIRHaQOiDOYjQ,如有侵權,請聯絡管理員刪除。

相關文章