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,可以支持重建表時同時進行增刪改查操作,大概流程如下:
- 建立臨時文件,掃描表主鍵的所有數據頁;
- 用數據頁中表的記錄生成B+樹,存儲到臨時文件;
- 生成臨時文件的過程中,將這個期間對表的所有操作記錄在 row log 的日志文件中;
- 臨時文件生成后,將日志中的操作應用到臨時文件;
- 臨時文件替換原來的表數據文件;
alter 語句啟動時獲取到表的DDL寫鎖,在拷貝數據前退化為讀鎖,退化讀鎖后可以繼續進行增刪改查操作,不釋放鎖是為了禁止其他線程對該表進行DDL操作;