當前位置:成語大全網 - 新華字典 - 數據庫存儲空間中碎片產生的原因 及如何回收碎片

數據庫存儲空間中碎片產生的原因 及如何回收碎片

以MySQL為例,碎片的存在十分影響性能

MySQL 的碎片是 MySQL 運維過程中比較常見的問題,碎片的存在十分影響數據庫的性能,本文將對 MySQL 碎片進行壹次講解。

判斷方法:

MySQL 的碎片是否產生,通過查看

show table status from table_nameG;

這個命令中 Data_free 字段,如果該字段不為 0,則產生了數據碎片。

產生的原因:

1. 經常進行 delete 操作

經常進行 delete 操作,產生空白空間,如果進行新的插入操作,MySQL將嘗試利用這些留空的區域,但仍然無法將其徹底占用,久而久之就產生了碎片;

演示:

創建壹張表,往裏面插入數據,進行壹個帶有 where 條件或者 limit 的 delete 操作,刪除前後對比壹下 Data_free 的變化。

刪除前:

刪除後:

Data_free 不為 0,說明有碎片;

2. update 更新

update 更新可變長度的字段(例如 varchar 類型),將長的字符串更新成短的。之前存儲的內容長,後來存儲是短的,即使後來插入新數據,那麽有壹些空白區域還是沒能有效利用的。

演示:

創建壹張表,往裏面插入壹條數據,進行壹個 update 操作,前後對比壹下 Data_free 的變化。

CREATE TABLE `t1` ( `k` varchar(3000) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

更新語句:update t1 set k='aaa';

更新前長度:223 Data_free:0

更新後長度:3 Data_free:204

Data_free 不為 0,說明有碎片;

產生影響:

1. 由於碎片空間是不連續的,導致這些空間不能充分被利用;

2. 由於碎片的存在,導致數據庫的磁盤 I/O 操作變成離散隨機讀寫,加重了磁盤 I/O 的負擔。

清理辦法:

MyISAM:optimize table 表名;(OPTIMIZE 可以整理數據文件,並重排索引)

Innodb:

1. ALTER TABLE tablename ENGINE=InnoDB;(重建表存儲引擎,重新組織數據)?

2. 進行壹次數據的導入導出

碎片清理的性能對比:

引用我之前壹個生產庫的數據,對比壹下清理前後的差異。

SQL執行速度:

select count(*) from test.twitter_11;

修改前:1 row in set (7.37 sec)

修改後:1 row in set (1.28 sec)

結論:

通過對比,可以看到碎片清理前後,節省了很多空間,SQL執行效率更快。所以,在日常運維工作中,應對碎片進行定期清理,保證數據庫有穩定的性能。