Mysql

使用 MyISAM 進行刪除和插入後的 MySQL 行為和磁碟空間處理

  • June 30, 2016

我對帶有 MyISAM 引擎的 MySQL 在刪除後處理空閒/空白空間的方式以及插入新記錄時的行為有疑問。

例如,考慮一個新的空數據庫(例如,假設是 10 kb)。

插入 10000 條記錄後(假設每條記錄佔用 1 kb),它在文件系統上的總大小變為 10010 kb。

然後,在刪除 50​​00 條記錄後,即使記錄數減半,它在文件系統上的大小仍為 10010 kb(這並不奇怪,這是正常行為)。

然後,OPTIMIZE 命令可以對數據庫進行“碎片整理”,並通過重新組織其數據來回收可用空間。

但是,如果我完全忽略 OPTIMIZE 命令並插入 2000 條新記錄(因此,仍然存在 5000 條 + 2000 條新記錄 = 總共 7000 條記錄),MySQL 是否會將先前刪除留下的可用空間用於新記錄(意味著10010 kb 的 DB 大小不會改變)還是將新記錄“附加”到 DB(這意味著文件系統上的 DB 大小將增長到,比如說,12010 kb)?

謝謝!:)

通常,如果 MyISAM 表在 DELETE 操作之後在數據文件的中間有空閒空間,它將在該空閒空間中插入行。然而,由於 MyISAM 實現並發的方式,它取決於工作負載會發生什麼。

來自MySQL 手冊

對於有孔的表,如果它正在被另一個執行緒使用,則在表的末尾插入新行。否則,MySQL 會獲取一個正常的寫鎖並將該行插入到孔中。

甚至在微調該 concurrent_insert 參數之後。

引用自:https://serverfault.com/questions/787101