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