mysql實戰45講學習筆記--13

    13 爲什麼表數據刪掉一半,表文件大小不變?

       數據庫表的空間回收
       InnoDB表包含兩部分,即:表結構定義和數據,在mysql8.0以前,表結構是存在以.frm爲後綴的文件裏,而8.0版本,則已經允許把表結構定義放在系統數據表。因爲表結構定義佔用的空間很小。

       參數innodb_file_per_table
       表數據既可以在共享空間裏,也可以是單獨的文件,由這個參數決定
       設置爲off表示表的數據放在系統共享表空間,和數據字典放在一起,設置爲on表示,每個InnoDB表數據存儲在一個以.ibd爲後綴的文件,5.6.6止嘔胡默認爲on。
       推薦將參數設置爲on。

       數據刪除流程
       刪掉一個記錄,就將這個記錄標記爲刪除,然後需要插入到這個位置的時候,直接複用這個位置。刪掉一個頁,這頁就可以複用到任何位置。
       因此用delete只是把記錄的位置,或者數據頁標記爲“可複用”,但磁盤文件的大小不變。也就是,通過delete不能回收表空間。這些可以複用,沒有實用的空間,就像空洞。
       更新索引上的值,可以理解爲刪除一箇舊的值,在插入一個新值。

 重建表

       重建表就是爲了將大量增刪改的表,去掉產生的空洞,達到收縮表空間的目的。
       可以使用alter table A engine=InnoDB來重建表。
       Online DDL重建表的流程
       1.建立一個臨時文件,掃描表A主鍵的所有數據頁
       2.用數據頁中表A的記錄生成B+樹,存儲到臨時文件中
       3.生成臨時文件的過程中,將所有對A的操作記錄在一個日誌文件(row log)中,對應state2的狀態
       4.臨時文件生成後,將日誌文件的操作應用到臨時文件,得到一個邏輯數據上與表A相同的數據文件,對應state3的狀態
       5.用臨時文件替換表A中的數據文件。
在這裏插入圖片描述

       在圖中,我們把表A中的數據導出來存放位置叫做tmp_table,這是一個臨時表,是在server層創建的。

       optimize table、analyze table 和alter table 這三種方式重建表的區別。
       從 MySQL 5.6 版本開始,alter table t engine = InnoDB(也就是 recreate)默認的就是上面圖 4 的流程了;
       analyze table其實不是重建表,只是對標的索引信息做重新同價,沒有修改數據,這個過程中加了MDL讀鎖。
       Optimize table t 等於recarate+analyze。

       小結
        如果要收縮一個表,只是 delete 掉表裏面不用的數據的話,表文件的大小是不會變的,你還要通過 alter table命令重建表,才能達到表文件變小的目的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章