以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執行效率更快。所以,在日常運維工作中,應對碎片進行定期清理,保證數據庫有穩定的性能。