mysql 5.7 Transparent PageIO Compression

yzs87發表於2017-12-13

上接上篇。本篇作為補充:

原理

innodb的透明頁IO壓縮,利用punch hole和資料壓縮來實現。在記憶體中是一個正常的頁,只有在寫到磁碟時,才進行壓縮。呼叫函式os_file_io_complete進行punch hole操作,os_file_io_complete呼叫的是fallocate()作業系統函式,並且使用 FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE標籤,回收磁碟上頁的空閒block。具體方法是先將壓縮後的內容寫入到磁碟,此時磁碟上頁仍然是16K,寫完成後,呼叫fallocate函式回收磁碟頁中空閒的block,該block以系統block_size為單位。

優點

1、記憶體中方便管理,只有正常頁,不存在壓縮後的頁

2、更加簡單靈活的使用壓縮演算法

3、程式碼上可以針對各種型別的頁進行壓縮

缺點

引用淘寶資料庫核心月報中內容:


  • 無法完美壓縮:例如9KB的資料可能需要12kb來儲存,取決於block size;
  • 無法壓縮Buffer pool, 這是和傳統innodb壓縮相比,以前的壓縮方式可以在記憶體中只存放壓縮頁複製 (然而也有可能同時存在壓縮和解壓頁),因此使用者可能需要去購買iops更高的裝置,而oracle正好也賣這些….
  • punch hole 可能產生的檔案碎片化,底層的檔案管理更加複雜;
  • 對innodb檔案做punch hole可能帶來的後果是,使得每個檔案的page變成一個獨立的segment,檔案系統需要單獨的journal和metadata來管理。另外也有可能有效能問題:可能比non-sparse的寫操作昂貴五倍 (這依賴於具體的核心);
  • 刪除一個擁有幾百萬個段管理物件的資料檔案帶來的開銷會非常昂貴。
mariadb
mysql的innodb中僅支援2種壓縮演算法,而mariadb的XTRADB中可支援zlib、lz4、lzo、lzma、bzip2、snappy等5種演算法。除了,zlib、lz4外,其他的需要下載程式碼進行編譯安裝。如何使用可參考

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2148674/,如需轉載,請註明出處,否則將追究法律責任。

相關文章