在mysql中,我們經常會使用varchar
、text
、blob
等可變長度的文字資料型別。不過,當我們使用這些資料型別之後,我們就不得不做一些額外的工作——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
語句有兩個可選的關鍵字:local
和no_write_to_binlog
。在預設情況下,optimize table
語句將會被記錄到二進位制日誌中,如果我們指定了local
或no_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 表名 來進行修復.注意 修復表的資料及...