MySQL:數據庫表的空間回收


1. 表數據的存儲方式

  表數據既可以存儲在共享表空間,也可以時單獨的文件。這個行為由參數 innodb_file_per_table 控制:

  設置為 OFF 時,表示表數據存儲在共享表空間;

  設置為 ON 時,表示表數據單獨存儲在一個以.ibd為后綴的文件之中;

  MySQL 5.6.6后默認值為 ON 。

  當使用 drop table 命令時,如果表數據存儲在單獨的文件中,系統直接會刪除這個文件;如果表數據存儲在共享表空間,即使刪除表也不會回收表空間。

2. 數據刪除流程

  當刪除一條記錄后,這個記錄的位置就可以被復用,不過只限於符合條件的數據;

  當整個數據頁的記錄全部被刪除后,這個數據頁可以復用到任何位置;

  使用delete 刪除記錄后,只是把記錄或者數據頁標記為可復用,並不會改變數據文件的大小;

  一個表經過大量的增刪改之后,可能會有許多沒有被利用的空間,此時就需要重建表來收縮空間。

3. 重建表

  可以使用 alter table xxx  engine = InnoDB命令重建表;

  MySQL 5.6.6 引入 Online DDL,可以支持重建表時同時進行增刪改查操作,大概流程如下:

  1. 建立臨時文件,掃描表主鍵的所有數據頁;
  2. 用數據頁中表的記錄生成B+樹,存儲到臨時文件;
  3. 生成臨時文件的過程中,將這個期間對表的所有操作記錄在 row log 的日志文件中;
  4. 臨時文件生成后,將日志中的操作應用到臨時文件;
  5. 臨時文件替換原來的表數據文件;

  alter 語句啟動時獲取到表的DDL寫鎖,在拷貝數據前退化為讀鎖,退化讀鎖后可以繼續進行增刪改查操作,不釋放鎖是為了禁止其他線程對該表進行DDL操作;

 


免責聲明!

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



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