由於處理器和快取記憶體的速度提升比磁碟儲存裝置更快,因此許多工作負載都是磁碟受限。資料壓縮可縮減資料庫大小、減少 I/O 並改善輸送量,但會稍微增加 CPU 使用率。對於讀取密集型的應用程式,以及具有足夠 RAM 來將常用資料保留在記憶體中的系統,壓縮特別有價值。
使用 ROW_FORMAT=COMPRESSED
建立的 InnoDB
表格可以在磁碟上使用比設定的 innodb_page_size
值更小的頁面大小。較小的頁面需要較少的 I/O 來從磁碟讀取和寫入,這對於 SSD 裝置特別有價值。
壓縮頁面大小是透過 CREATE TABLE
或 ALTER TABLE
KEY_BLOCK_SIZE
參數指定。不同的頁面大小要求將表格放置在每個表格的表空間或一般表空間中,而不是在系統表空間中,因為系統表空間無法儲存壓縮的表格。如需更多資訊,請參閱第 17.6.3.2 節「每個表格的表空間」和第 17.6.3.3 節「一般表空間」。
無論 KEY_BLOCK_SIZE
值為何,壓縮等級都相同。當您為 KEY_BLOCK_SIZE
指定較小的值時,您會獲得越來越小的頁面的 I/O 優勢。但是,如果您指定的值太小,則當資料值無法壓縮到足以在每個頁面中放入多列時,重新組織頁面會有額外的負荷。根據每個索引的索引鍵欄位的長度,表格的 KEY_BLOCK_SIZE
可以有多小的硬性限制。指定的值太小,則 CREATE TABLE
或 ALTER TABLE
陳述式將會失敗。
在緩衝池中,壓縮資料會保留在小型頁面中,頁面大小會根據 KEY_BLOCK_SIZE
值而定。為了擷取或更新欄位值,MySQL 還會在緩衝池中建立具有未壓縮資料的未壓縮頁面。在緩衝池中,對未壓縮頁面的任何更新也會重新寫回對等的壓縮頁面。您可能需要調整緩衝池的大小,以容納壓縮頁面和未壓縮頁面的額外資料,儘管在需要空間時,未壓縮頁面會從緩衝池中逐出,然後在下次存取時再次解壓縮。