mysql 压缩表_MySQL InnoDB 表压缩(行格式压缩)
MySQL InnoDB支持數據壓縮,有兩種數據壓縮方式,第一種為表壓縮,通常也稱之為行格式壓縮,另外一種是頁壓縮,頁壓縮對操作系統及文件系統有一定的要求。本文主要介紹表壓縮(行格式壓縮)的原理及使用方法。
表壓縮適用的場景:
有很多字符串類型的字段,比如char, varhcar, text之類。
讀多寫少的業務場景。
表壓縮支持獨立表空間和共享表空間,不支持系統表空間。
獨立表空間:file-per-table
共享表空間:general tablespace
1. 獨立表空間創建壓縮表
前提條件:
innodb_file_per_table=ON
innodb_file_format=Barracuda
創建語法:
CREATE TABLE t1 (c1 INT PRIMARY KEY) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
2. 共享表空間創建壓縮表
前提條件:
在general tablespace表空間中創建壓縮表,必須要設置FILE_BLOCK_SIZE,它的有效值與innodb_page_size相關,KEY_BLOCK_SIZE?必須為 FILE_BLOCK_SIZE/1024。
例如:
innodb_page_size=16384
FILE_BLOCK_SIZE=8192
KEY_BLOCK_SIZE=FILE_BLOCK_SIZE/1024=8
創建語法:
CREATE TABLESPACE ts2 ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;
CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
3. 表壓縮語法及原理
3.1 表壓縮語法
InnoDB使用如下語法進行壓縮表的創建:
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8
如果沒有指定KEY_BLOCK_SIZE值,默認為innodb_page_size值的一半,也就是8KB。
32KB 和 64KB的頁大小不支持壓縮。默認的InnoDB未壓縮的頁大小為16KB,KEY_BLOCK_SIZE 可設置為1KB,2KB,4KB,8KB,16KB,KEY_BLOCK_SIZE應當設置為大于表中一條記錄的最大長度,實際的壓縮算法不受KEY_BLOCK_SIZE值影響,這個值決定每個壓縮塊有多大,間接影響一個壓縮后的頁能夠存放多少個行記錄。如果將KEY_BLOCK_SIZE設置的與頁大小一致,比如16K,不會導致太多的壓縮,因為正常的一個頁面就是16K,但是這樣的設置對于blob, text, varchar類型有很好的壓縮效果。
3.2 表壓縮原理
處理器和內存的計算和存儲速度遠遠大于磁盤IO,因此大多數場景下,數據庫性能瓶頸在磁盤IO上,數據壓縮能夠顯著減少數據的大小,減少磁盤IO次數,提高吞吐量,唯一的成本是CPU消耗將會稍微增加。數據壓縮對于讀密集型的應用有非常好的效果。
創建壓縮格式的表,能夠使用比innodb_page_size更小的頁,更小的頁意味著更少的磁盤IO讀寫。
壓縮之后的頁大小由參數 KEY_BLOCK_SIZE 指定。如果該值指定的越小,可能會獲得越好的IO性能提升,但是如果該值太小,可能會帶來其他的額外開銷,比如壓縮后的數據無法完整容納在一個非常小的頁面里。當然對于KEY_BLOCK_SIZE的值,有一個硬性限制,這個限制基于索引字段的長度,如果KEY_BLOCK_SIZE太小,則會導致create table或者alter table語句執行報錯。
對于一個打開壓縮功能的表,表中的所有索引,包括聚簇索引、二級索引,都會使用同樣的頁大小進行壓縮。
在buffer pool里面,壓縮后的數據存放在更小的頁里,頁大小由KEY_BLOCK_SIZE指定。如果要更新一個壓縮頁面里的字段值,需要在buffer pool里面創建一個未壓縮的頁面來存放解壓后的數據,在buffer pool里面,對未壓縮頁的更新都會重新寫回與之相對應的壓縮的頁。因此打開壓縮功能之后,需要增加buffer pool的大小,以容納額外的數據(壓縮和未壓縮的頁面),當buffer pool里面空閑空間不足時,未壓縮的頁會被釋放,而當下一次訪問需要未壓縮頁面時,它會被再次創建。
4. 表壓縮監控
主要通過information_schema里面的幾個表來監控壓縮狀態。
information_schema.INNODB_CMP
information_schema.INNODB_CMPMEM
information_schema.INNODB_CMPMEM_RESET
information_schema.INNODB_CMP_PER_INDEX,默認這個表的監控是關閉的,需要設置參數innodb_cmp_per_index_enabled=ON打開,但對性能有一定影響。
5. 表壓縮相關參數
innodb_compression_level,設置壓縮級別,取值范圍0~9,默認值為6。
innodb_compression_failure_threshold_pct,定義了表壓縮失敗率閾值,超過這個閾值時,通過增加壓縮頁中的保留空間,來降低壓縮失敗率。取值范圍0~100,默認值為5。
innodb_compression_pad_pct_max,壓縮頁中保留的空閑空間的最大比例,取值范圍0~75,默認值為50。
innodb_log_compressed_pages,指定重新壓縮的頁數據是否寫入redo log里面,默認值為ON,如果zlib版本不變,建議設置為OFF。
當表壓縮導致CPU負載過高,可以考慮降低壓縮級別(innodb_compression_level),來減少壓縮對CPU的消耗。
6. 表壓縮使用限制
MySQL 5.1 之前的版本不支持表壓縮。
壓縮表不能存放在InnoDB系統表空間。
General tablespaces 表空間可以包含多個表,但是壓縮的表和未壓縮的表不同共存于一個General tablespaces里面。
表壓縮是對整個表的壓縮,包括與表相關的所有索引,不能只對指定的行進行壓縮。
總結
以上是生活随笔為你收集整理的mysql 压缩表_MySQL InnoDB 表压缩(行格式压缩)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 短url服务java_Serverles
- 下一篇: java卡安全域_java – 在安全