日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 压缩表_MySQL InnoDB 表压缩(行格式压缩)

發布時間:2024/4/14 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 表压缩(行格式压缩)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。