技術分享 MySQL 碎片問題

2021-09-25 02:16:58 字數 1552 閱讀 5036

​mysql 的碎片是 mysql 運維過程中比較常見的問題,碎片的存在十分影響資料庫的效能,本文將對 mysql 碎片進行一次講解。

mysql 的碎片是否產生,通過檢視

show table status from table_name\g;
這個命令中 data_free 字段,如果該欄位不為 0,則產生了資料碎片。

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

建立一張表,往裡面插入資料,進行乙個帶有 where 條件或者 limit 的 delete 操作,刪除前後對比一下 data_free 的變化。

刪除前:

刪除後:

data_free 不為 0,說明有碎片;

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 的負擔。

innodb:

alter table tablename engine=innodb;(重建表儲存引擎,重新組織資料) 

進行一次資料的匯入匯出

引用我之前乙個生產庫的資料,對比一下清理前後的差異。

庫名清理前大小

清理後大小

facebook

2.2g

1.1g

instagram

40g22g

linkedin

555m

208m

googleplus

19g8.4g

twitter

107g

44gsql執行速度:

select count(*) from test.twitter_11;
修改前:1 row in set (7.37 sec)

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

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

mysql可以分享的技術 技術分享 MySQL

1 查詢語句是如何執行的?1 連線 1 建立連線 2 驗證許可權,修改了許可權,建立新的連線才會生效。3 sql執行的臨時記憶體 2 查詢快取 1 先查詢快取,更新操作會導致所有快取失效。2 mysql 8.0功能去掉 3 分析 詞法解析,語法解析 4 優化 1 決定使用哪個索引,比方說根據統計資訊...

mysql碎片空間 mysql碎片應用

1.查詢結果集中自增功能 set i 0 select i i 1 id 2.資料庫備份 mysqldump database uroot p beifen.sql 3.資料庫表空間tablespace優化 show table status from database like table nam...

mysql索引碎片整理 MysqL碎片整理優化

先來說一下什麼是碎片,怎麼知道碎片有多大!簡單的說,刪除資料必然會在資料檔案中造成不連續的空白空間,而當插入資料時,這些空白空間則會被利用起來.於是造成了資料的儲存位置不連續,以及物理儲存順序與理論上的排序順序不同,這種是資料碎片.實際上資料碎片分為兩種,一種是單行資料碎片,另一種是多行資料碎片.前...