MySQL資料表碎片整體

2021-09-11 17:52:07 字數 2708 閱讀 5053

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

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

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

--建立demo表

create table demo(

id int unsigned,

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;
眾所周知,mysql中myisam表的資料是以檔案形式儲存的,我們可以在mysql儲存資料的資料夾中找到資料庫test目錄下的demo.myd檔案。此時,我們可以看到demo.myd檔案的大小約為50mb。

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

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

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

那麼就究竟是怎麼一回事呢?原來,在mysql中,如果我們刪除了表中的大量資料,或者我們對含有可變長度文字資料型別(varchartextblob)的表進行了很多更改,不過被刪除的資料記錄仍然被保持在mysql的鏈結清單中,因此資料儲存檔案的大小並不會隨著資料的刪除而減小。

當我們確定資料需要被清除掉時,那麼這些資料就已經成了無用的資料,但是按照mysql的處理方式,這些資料仍然會占用我們的磁碟空間,從而造成了極大的資源浪費。不僅如此,過大的資料檔案還會導致mysql執行相關資料操作時需要耗費更多的效能和時間。因此,對mysql的某些資料表進行碎片整理是非常有必要的。

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.myd檔案,此時我們就會發現demo.myd檔案的大小已經減小到約為原來的3/5了。

備註:1.mysql官方建議不要經常(每小時或每天)進行碎片整理,一般根據實際情況,只需要每週或者每月整理一次即可。

2.optimize table只對myisam,bdb和innodb表起作用,尤其是myisam表的作用最為明顯。此外,並不是所有表都需要進行碎片整理,一般只需要對包含上述可變長度的文字資料型別的表進行整理即可。

3.在optimize table執行過程中,mysql會鎖定表。

4.預設情況下,直接對innodb引擎的資料表使用optimize table,可能會顯示「 table does not support optimize, doing recreate + analyze instead」的提示資訊。這個時候,我們可以用mysqld --skip-new或者mysqld --safe-mode命令來重啟mysql,以便於讓其他引擎支援optimize table

mysql資料表命令是 MySQL資料表操作命令

mysql語句 1 修改表名 rename table 舊表名 to 新錶名 2 修改字段型別 alter table 表名 modify column 欄位名 字段型別 長度 3 修改欄位名稱和型別 alter table 表名 change 現有欄位名稱 修改後欄位名稱 資料型別 4 增加字段 ...

MySQL資料表型別

mysql資料表支援六種型別 分別是 bdb heap isam merge myisam innobdb,這六種又分為兩類,單獨一類是bdb,稱為 事務安全型 transaction safe 其餘都屬於第二類,稱為 非事務安全型 non transaction safe 下面詳細介紹這些表 事務...

Mysql資料表備份

用mysqldump備份資料 同mysqlimport一樣,也存在乙個工具mysqldump備份資料,但是它比sql語句多做的工作是可以在匯出的檔案中包括sql語 句,因此可以備份資料庫表的結構,而且可以備份乙個資料庫,甚至整個資料庫系統。mysqldump options database tab...