Mysql

將引擎從 myisam 更改為 innodb 後,表的大小更大,這是預期的行為嗎?

  • June 29, 2020

我在使用 apache 和 mysql 的伺服器上將 WordPress 數據庫從 myisam 更新為 innodb,我注意到一些表(例如 wp-posts)在執行ALTER TABLE wp_posts ENGINE=InnoDB;命令後大小增加了大約 20MB。所以,這是我第一次這樣做,我想知道這是否是預期的行為?

謝謝,

在儲存引擎技術的所有日子裡,這是一個已知問題(不是錯誤)

有人在 2014 年 11 月的 Percona 論壇上問了一個類似的問題:InnoDB 和 MyISAM 引擎之間的表大小不同 7 倍

這可能與 MyISAM 和 InnoDB 之間的儲存粒度有關。

MyISAM

根據MyISAM 動態數據文件佈局

可變長度記錄包含在“幀”中。一條記錄可以放在一個或多個幀中,也稱為記錄“部分”或“塊”。框架的意義是允許重複使用已刪除記錄的空間。從一個空數據文件開始,每個記錄都放在一個幀中,除非記錄大於最大幀大小 (16MB - 4)。當一條記錄被刪除時,它的框架被標記為已刪除。在此之後插入記錄時,它會重用舊框架。如果新記錄較小,則拆分幀。未使用的部分被標記為已刪除。如果新記錄大於舊幀,則該幀將盡可能多地填充該記錄。其餘的插入其他舊幀中,或者,如果沒有可用,則插入文件末尾的新幀中。

InnoDB

InnoDB 頁面的大小預設為 16K:innodb_page_size

比較

由於 InnoDB 儲存在一個固定的 16K“幀”中,而 MyISAM 儲存在大小可以變化到 16777212 (16M - 4) 的幀中,因此人們應該總是期望 InnoDB 表更大,因為需要將數據拆分到固定的 16K 中“框架”。

引用自:https://dba.stackexchange.com/questions/270030