大家都知道Windows磁盤工具裡有一個磁盤碎片整理,與之類似的是,MySQL數據庫裡也會産生碎片,也需要整理。
MySQL碎片就是指數據文件中一些不連續的空白空間,因為大小的原因。這些空白空間無法被全部利用上,久而久之,這些空白空間越來越多,越來越碎,從而就會引起物理存儲和邏輯存儲的位置順序不一緻的問題,導緻了碎片的産生。
一、數據庫碎片的産生。
MySQL在執行delete或者update操作時,就有可能産生碎片。
在執行delete操作的時候,存儲中會産生由于delete操作而留下的空白空間,而當有新數據插入時,MySQL會嘗試使用這些空白空間,但是數據又不可能完全一緻,正好把空白覆蓋滿,于是會就有空白空間出現。尤其是在大量delete操作的時候,會出現大量的空白空間。
在執行update的時候,例如在可變長度的字段,比如說varchar或lob,更新的數據可能和原來的長度不一樣,這樣也會産生碎片。比如說原始長度是varchar(100),但我們更新了大量長度為50的數據,這樣的話,就有50的空間成為了空白。對于MySQL的innodb存儲引擎來說,表存儲數據的單位是頁,而update操作會造成頁分裂,分裂以後存儲變得不連續、不規則,從而産生碎片。
二、碎片造成的問題
碎片會造成很多問題例如說空間浪費和讀寫性能下降。由于存在大量碎片,數據從連續規則的存儲方式變為随機分散的存儲方式,會增加磁盤IO的負擔,于是讀寫性能會下降。
三、MySQL中如何處理碎片
在MySQL中,可以利用
show table status like ‘%table_name%’;
語句來查看表狀态。
其中data_length是表數據大小,index_length是表索引大小,data_free就是碎片大小,當data_free大于0時,意味着表中有碎片。
optimize table table_name;
語句可以清理碎片,但并不是所有的存儲引擎都支持(程序員應知應會之MySQL的存儲引擎),該語句适用于InnoDB、MyISAM 和 ARCHIVE 表。
此操作會鎖表,時間長短依據表數據量的大小。
另外我們也可以通過重建表的存儲引擎來重組數據和索引的存儲,從而達到清理碎片的目的。
語句如下:
alter table table_name engine = innodb;
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!