原創做者: 宗楊數據庫
MySQL 的碎片是 MySQL 運維過程當中比較常見的問題,碎片的存在十分影響數據庫的性能,本文將對 MySQL 碎片進行一次講解。運維
MySQL 的碎片是否產生,經過查看性能
show table status from table_name\G;
這個命令中 Data_free 字段,若是該字段不爲 0,則產生了數據碎片。google
1. 常常進行 delete 操做spa
常常進行 delete 操做,產生空白空間,若是進行新的插入操做,MySQL將嘗試利用這些留空的區域,但仍然沒法將其完全佔用,長此以往就產生了碎片;code
演示:blog
建立一張表,往裏面插入數據,進行一個帶有 where 條件或者 limit 的 delete 操做,刪除先後對比一下 Data_free 的變化。索引
刪除前:字符串
刪除後:it
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. 進行一次數據的導入導出
碎片清理的性能對比:
引用我以前一個生產庫的數據,對比一下清理先後的差別。
空間對比:
庫名 | 清理前大小 | 清理後大小 |
---|---|---|
2.2G | 1.1G | |
40G | 22G | |
555M | 208M | |
googleplus | 19G | 8.4G |
107G | 44G |
SQL執行速度:
select count(*) from test.twitter_11;
修改前:1 row in set (7.37 sec)
修改後:1 row in set (1.28 sec)
經過對比,能夠看到碎片清理先後,節省了不少空間,SQL執行效率更快。因此,在平常運維工做中,應對碎片進行按期清理,保證數據庫有穩定的性能。