mysql 清理表空間 MySQL 清除表空間碎片

2021-10-17 16:09:44 字數 1242 閱讀 5517

碎片產生的原因

(1)表的儲存會出現碎片化,每當刪除了一行內容,該段空間就會變為空白、被留空,而在一段時間內的大量刪除操作,會使這種留空的空間變得比儲存列表內容所使用的空間更大;

(2)當執行插入操作時,mysql會嘗試使用空白空間,但如果某個空白空間一直沒有被大小合適的資料占用,仍然無法將其徹底占用,就形成了碎片;

(3)當mysql對資料進行掃瞄時,它掃瞄的物件實際是列表的容量需求上限,也就是資料被寫入的區域中處於峰值位置的部分;

例如:乙個表有1萬行,每行10位元組,會占用10萬位元組儲存空間,

執行刪除操作,只留一行,實際內容只剩下10位元組,但mysql

在讀取時,仍看做是10萬位元組的表進行處理,所以,碎片越多,

就會越來越影響查詢效能。

檢視表碎片大小

(1)檢視某個表的碎片大小

mysql> show table status like '表名';

結果中』data_free』列的值就是碎片大小

(2)列出所有已經產生碎片的表

mysql> select table_schema db, table_name,

data_free, engine     from information_schema.tables where

table_schema not

in('information_schema',

'mysql')

anddata_free > 0;

清除表碎片

(1)myisam表

mysql> optimize table 表名

(2)innodb表

mysql> alter table 表名 engine=innodb

engine不同,optimize 的操作也不一樣的,myisam 因為索引和資料是分開的,所以 optimize 可以整理資料檔案,並重排索引.

optimize 操作會暫時鎖住表,而且資料量越大,耗費的時間也越長,它畢竟不是簡單查詢操作.所以把 optimize 命令放在程式中是不妥當的,不管設定的命中率多低,當訪問量增大的時候,整體命中率也會上公升,這樣肯定會對程式的執行效率造成很大影響.比較好的方式就是做個shell,定期檢查mysql中 information_schema.tables欄位,檢視 data_free 字段,大於0話,就表示有碎片

建議清除碎片操作會暫時鎖表,資料量越大,耗費的時間越長,可以做個指令碼,定期在訪問低谷時間執行,例如每週三凌晨,檢查data_free欄位,大於自己認為的警戒值的話,就清理一次。

清理表空間

1 清理表 truncate table 2 重建temp表空間 create temporary tablespace temp1 tempfile d oracle product 10.2.0 oradata xgp3 temp02.dbf size 512m reuse autoextend...

mysql 表空間收縮 mysql壓縮表空間

repair table table name 修復表 optimize table table name 優化表 optimize local no write to binlog table tbl name tbl name 如果您已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表 含...

優化mysql表空間 mysql表空間釋放情況彙總

mysql刪除資料幾種情況以及是否釋放磁碟空間 1 drop table table name 立刻釋放磁碟空間 不管是 innodb和myisam 2 truncate table table name 立刻釋放磁碟空間 不管是 innodb和myisam truncate table其實有點類似...