MYSQL優化之碎片整理

2021-09-07 14:35:13 字數 4336 閱讀 1210

mysql

優化之碎片整理

在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

語句多次插入產生總共約

262萬條資料

眾所周知,

mysql

中myisam

表的資料是以檔案形式儲存的,我們可以在

mysql

儲存資料的資料夾中找到資料庫

test

目錄下的

demo.myd

檔案。此時,我們可以看到

demo.myd

檔案的大小約為

檔案約為

50mb

此時,假如我們需要刪除

demo

表中所有

id列小於

3的資料(即

1和2),於是我們執行如下

sql語句:

delete from demo where id <3

此時,我們可以看到

demo

表中的資料量只有原來的

刪除後,只剩下

157萬條記錄

demo

表中的現有資料量只有原來的

3/5,按理說,這個時候

demo.myd

檔案的大小也應該只有原來的

3/5左右。不過,我們再次檢視

demo.myd

檔案時,卻驚奇地發現該檔案的大小一點都沒有變!

刪除資料後,

demo.myd

的檔案大小沒有變化

那麼就究竟是怎麼一回事呢?原來,在

mysql

中,如果我們刪除了表中的大量資料,或者我們對含有可變長度文字資料型別

(varchar

,text

或blob

)的表進行了很多更改,不過被刪除的資料記錄仍然被保持在

mysql

的鏈結清單中,因此資料儲存檔案的大小並不會隨著資料的刪除而減小。

當我們確定資料需要被清除掉時,那麼這些資料就已經成了無用的資料,但是按照

mysql

的處理方式,這些資料仍然會占用我們的磁碟空間,從而造成了極大的資源浪費。不僅如此,過大的資料檔案還會導致

mysql

mysql

的某些資料表進行碎片整理是非常有必要的。

對mysql

進行碎片整理的方法非常簡單,因為

mysql

已經給我們提供了對應的

sql指令,這個

sql指令就是

optimize table

,其完整語法如下:

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

檔案的大小

備註: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碎片整理優化

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

mysql碎片整理 提速 MysqL碎片整理優化

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