mysql如何收縮表空間


 

參數 innodb_file_per_table   

mysql5.6.6版本以后,默認設置為ON,表示innodb表數據存儲在一個以.ibd為后綴的文件中  

不建議設置為OFF,原因是  設置為OFF后,會將表數據存儲在系統共享表空間中,即使drop掉表,空間也不會被回收【磁盤空間不會減少,只會無腦增加】

 

數據刪除、修改:

innodb數據都是用B+樹結構

 

當R4的數據刪除以后,mysql會在R4這個位置記錄一個標記為刪除,當插入300~600之間的數據值,R4這個位置會被復用

當page A 整個數據頁被刪除后,整個頁就會被標記為可復用 

 

但是數據頁的復用和記錄的復用是不一樣的:

記錄的復用只限於: 只限於符合范圍條件的數據

數據頁的復用:當一個數據頁寫滿后,需要使用新的數據頁,就可以被復用;如果相鄰的兩個數據頁利用率都很小,系統就會把這兩個頁上的數據合到其中一個頁上,另外一個數據頁就被標記為可復用。

 

delete 命令其實只是把記錄的位置,或者數據頁標記為了“可復用”,但磁盤文件的大小是不會變的。所以,單靠delete 命令是不能回收表空間的

update可以理解為:刪除一個舊的值,再插入一個新值

總結:經過大量的增刪改,數據頁上都是可能會存在空洞。

 

收縮表空間的方法:

重建表   建議使用命令:alter table a engine=InnoDB

mysql5.6版本之后引入了online DDL,重建表流程如下:

1.建立一個臨時文件,掃描表 A 主鍵的所有數據頁;

2.用數據頁中表 A 的記錄生成 B+ 樹,存儲到臨時文件中;

3.生成臨時文件的過程中,將所有對 A 的操作記錄在一個日志文件(row log)中        #mysql5.6之前還沒有引入onine DDL機制,不會生成row log日志

4.臨時文件生成后,將日志文件中的操作應用到臨時文件,得到一個邏輯數據上與表 A 相同的數據文件

5.用臨時文件替換表 A 的數據文件。

重建方法都會掃描原表數據和構建臨時文件。對於很大的表來說,這個操作是很消耗 IO 和 CPU 資源的。推薦使用 GitHub 開源的 gh-ost

 

optimize table、analyze table 和 alter table 這三種方式重建表的區別

從 MySQL 5.6 版本開始,alter table t engine = InnoDB(也就是 recreate,上邊的流程)

analyze table t 其實不是重建表,只是對表的索引信息做重新統計,沒有修改數據,這個過程中加了 MDL 讀鎖;

optimize table t 等於 recreate+analyze。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM