由於處理器和快取記憶體的速度增加幅度大於磁碟儲存裝置,因此許多工作負載都是磁碟受限。資料壓縮可縮減資料庫大小、減少 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 也會在緩衝池中建立包含未壓縮資料的未壓縮頁面。在緩衝池內,對未壓縮頁面的任何更新也會重新寫回對應的壓縮頁面。您可能需要調整緩衝池的大小,以容納壓縮和未壓縮頁面的額外資料,儘管未壓縮頁面在需要空間時會從緩衝池驅逐,然後在下次存取時再次解壓縮。