mysql 碎片清理

2021-09-07 16:25:17 字數 1904 閱讀 5423

在mysql中,我們經常會使用varchartextblob等可變長度的文字資料型別。不過,當我們使用這些資料型別之後,我們就不得不做一些額外的工作——mysql資料表碎片整理。

那麼,為什麼在使用這些資料型別之後,我們就要對mysql定期進行碎片整理呢?

現在,我們先來看乙個具體的例子。在這裡,我們使用如下sql語句在mysql自帶的test資料庫中建立名為demo的資料表並插入5條測試資料。

--建立demo表

create table demo(

id intunsigned,

body text

)engine=myisam charset=utf8;

--插入5條測試資料

insert into demo values(1,'aaaaa');

insert into demo values(2,'bbbbb');

insert into demo values(3,'ccccc');

insert into demo values(4,'ddddd');

insert into demo values(5,'eeeee');

然後我們以這5條測試資料為基礎,使用如下insert into語句重複執行多次進行複製性插入。

insert into demo select id,body from demo;

使用insert into語句多次插入產生總共約262萬條資料

demo.myd檔案約為50mb

此時,假如我們需要刪除demo表中所有id列小於3的資料(即1和2),於是我們執行如下sql語句:

delete from demo where id <3

此時,我們可以看到demo表中的資料量只有原來的3/5:

刪除後,只剩下157萬條記錄

demo表中的現有資料量只有原來的3/5,按理說,這個時候demo.myd檔案的大小也應該只有原來的3/5左右。不過,我們再次檢視demo.myd檔案時,卻驚奇地發現該檔案的大小一點都沒有變!

刪除資料後,demo.myd的檔案大小沒有變化

optimize [local | no_write_to_binlog] table table_name1 [, table_name2] ...
從上面的語法描述中,我們可以得知,optimize table可以一次性對多個表進行碎片整理,只需要在optimize table後面接多個表名,並以英文逗號隔開即可。

此外,optimize table語句有兩個可選的關鍵字:localno_write_to_binlog。在預設情況下,optimize table語句將會被記錄到二進位制日誌中,如果我們指定了localno_write_to_binlog

現在,我們就使用optimize table語句對剛才的demo表進行碎片整理。

對demo表進行碎片整理

然後,我們再來檢視demo.myd檔案,此時我們就會發現demo.myd檔案的大小已經減小到約為原來的3/5了。

碎片整理後demo.myd檔案的大小

命令來重啟mysql,以便於讓其他引擎支援optimize table

mysql 清理碎片

顯示你資料庫中存在碎片的全部列表 select table schema,table name,data free,engine from information schema.tables where table schema not in information schema mysql and...

mysql 碎片清理

在mysql中,我們經常會使用varchar text blob等可變長度的文字資料型別。不過,當我們使用這些資料型別之後,我們就不得不做一些額外的工作 mysql資料表碎片整理。那麼,為什麼在使用這些資料型別之後,我們就要對mysql定期進行碎片整理呢?現在,我們先來看乙個具體的例子。在這裡,我們...

MySQL優化 定期清理索引碎片

在長期的資料更改過程中,索引檔案和資料檔案,都將產生空洞,形成碎片.我們可以通過乙個nop操作 不產生對資料實質影響的操作 來修改表.比如 表的引擎為innodb 可以 alter table engine innodb。也可以使用optimize table 表名 來進行修復.注意 修復表的資料及...