最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解mysql表數(shù)據(jù)壓縮

 更新時間:2022年01月20日 14:25:55   作者:茁壯的小草  
mysql進行壓縮是借助于zlib庫,采用L777壓縮算法,這種算法在減少數(shù)據(jù)大小、CPU利用方面是成熟的、健壯的、高效的,這篇文章主要介紹了mysql表數(shù)據(jù)壓縮,需要的朋友可以參考下

記得一次面試中,面試官問我是否知道表的壓縮,這個時候我才知道m(xù)ysql有個表壓縮這么個功能,今天試用下看看表的壓縮率怎么樣。

這里分兩個部分說明,第一部分:官方文檔說明;第二部分:具體實例測試。

【第一部分】

一、表壓縮概述:

表壓縮可以在創(chuàng)建表時開啟,壓縮表能夠使表中的數(shù)據(jù)以壓縮格式存儲,壓縮能夠顯著提高原生性能和可伸縮性。壓縮意味著在硬盤和內(nèi)存之間傳輸?shù)臄?shù)據(jù)更小且占用相對少的內(nèi)存及硬盤,對于輔助索引,這種壓縮帶來更加明顯的好處,因為索引數(shù)據(jù)也被壓縮了。壓縮對于硬盤是SSD的存儲設(shè)備尤為重要,因為它們相對普通的HDD硬盤比較貴且容量有限。

我們都知道,CPU和內(nèi)存的速度遠遠大于磁盤,因為對于數(shù)據(jù)庫服務(wù)器,磁盤IO可能會成為緊要資源或者瓶頸。數(shù)據(jù)壓縮能夠讓數(shù)據(jù)庫變得更小,從而減少磁盤的I/O,還能提高系統(tǒng)吞吐量,以很小的成本(耗費較多的CPU資源)。對于讀比重比較多的應(yīng)用,壓縮是特別有用。壓縮能夠讓系統(tǒng)擁有足夠的內(nèi)存來存儲熱數(shù)據(jù)。

在創(chuàng)建innodb表時帶上ROW_FORMAT=COMPRESSED參數(shù)能夠使用比默認的16K更小的頁。這樣在讀寫時需要更少的I/O,對于SSD磁盤更有價值。

頁的大小通過KEY_BLOCK_SIZE參數(shù)指定。不同大小的頁意味著需要使用獨立表空間,不能使用系統(tǒng)共享表空間,可以通過innodb_file_per_table指定。KEY_BLOCK_SIZE的值越小,你獲得I/O好處就越多,但是如果因為你指定的值太小,當(dāng)數(shù)據(jù)被壓縮到不足夠滿足每頁多行數(shù)據(jù)記錄時,會產(chǎn)生額外的開銷來重組頁。對于一個表,KEY_BLOCK_SIZE的值有多小是有嚴格的限制的,一般是基于每個索引鍵的長度。有時指定值過小,當(dāng)create table或者alter table會失敗。

在緩沖池中,被壓縮的數(shù)據(jù)是存儲在小頁中的,這個小頁的實際大小就是KEY_BLOCK_SIZE的值。為了提取和更新列值,mysql也會在緩沖池中創(chuàng)建一個未壓縮的16k頁。任何更新到未壓縮的頁也需要重新寫入到壓縮的頁,這時你需要估計緩沖池的大小以滿足壓縮和未壓縮的頁,盡管當(dāng)緩沖空間不足時,未壓縮的頁會被擠出緩沖池。在下次訪問時,不壓縮的頁還會被創(chuàng)建。

二、使用表的壓縮

在創(chuàng)建一個壓縮表之前,需要啟用獨立表空間參數(shù)innodb_file_per_table=1;也需要設(shè)置innodb_file_format=Barracuda,你可以寫到my.cnf文件中不需要重啟mysql服務(wù)。

SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=Barracuda;
CREATE TABLE t1
 (c1 INT PRIMARY KEY) 
 ROW_FORMAT=COMPRESSED  
 KEY_BLOCK_SIZE=8;
  • 如果你指定ROW_FORMAT=COMPRESSED,那么可以忽略KEY_BLOCK_SIZE的值,這時使用默認innodb頁的一半,即8kb;
  • 如果你指定了KEY_BLOCK_SIZE的值,那么你可以忽略ROW_FORMAT=COMPRESSED,因為這時會自動啟用壓縮;
  • 為了指定最合適KEY_BLOCK_SIZE的值,你可以創(chuàng)建表的多個副本,使用不同的值進行測試,比較他們的.ibd文件的大??;
  • KEY_BLOCK_SIZE的值作為一種提示,如必要,Innodb也可以使用一個不同的值。0代表默認壓縮頁的值,Innodb頁的一半。KEY_BLOCK_SIZE的值只能小于等于innodb page size。如果你指定了一個大于innodb page size的值,mysql會忽略這個值然后產(chǎn)生一個警告,這時KEY_BLOCK_SIZE的值是Innodb頁的一半。如果設(shè)置了innodb_strict_mode=ON,那么指定一個不合法的KEY_BLOCK_SIZE的值是返回報錯。

InnoDB未壓縮的數(shù)據(jù)頁是16K,根據(jù)選項組合值,mysql為每個表的.ibd文件使用1kb,2kb,4kb,8kb,16kb頁大小,實際的壓縮算法并不會受KEY_BLOCK_SIZE值影響,這個值只是決定每個壓縮塊有多大,從而影響多少行被壓縮到每個頁。設(shè)置KEY_BLOCK_SIZE值等于16k并不能有效的進行壓縮,因為默認的innodb頁就是16k,但是對于擁有很多BLOB,TEXT,VARCHAR類型字段的表可能會有效果的。

三、InnoDB表的壓縮優(yōu)化

在進行表壓縮時需要考慮影響壓縮性能的因素,如:

  • 哪些表需要壓縮
  • 如何選擇壓縮表的頁大小
  • 基于運行時性能特征是否需要調(diào)整buffer pool大小,如系統(tǒng)在壓縮和解壓縮數(shù)據(jù)所花費的時間量,系統(tǒng)負載更像一個數(shù)據(jù)倉庫還是OLTP事務(wù)性系統(tǒng)。
  • 如果在壓縮表上執(zhí)行DML操作,由于數(shù)據(jù)分布的方式,可能導(dǎo)致壓縮失敗,這時你可能需要配置額外的更高級的配置選項

1、何時用壓縮表

一般而言,對于讀遠遠大于寫的應(yīng)用以及擁有合理數(shù)量的字符串列的表,使用壓縮效果會更好。

2、數(shù)據(jù)特性及壓縮率

影響數(shù)據(jù)文件壓縮效率的一個關(guān)鍵因素是數(shù)據(jù)本身的結(jié)構(gòu),在塊數(shù)據(jù)中,壓縮是通過識別重復(fù)字符進行壓縮的,對于完全隨機的數(shù)據(jù)是一個糟糕的情況,一般而言,有重復(fù)數(shù)據(jù)的壓縮更好。對于字符串的列壓縮就不錯,無論是string還是blob、text等類型的。另一方面,如果表中的數(shù)據(jù)是二進制類型,如整形、浮點型等或者之前別壓縮過的如jpg、png類型的,壓縮效果一般不好,但也不是絕對的。

為了決定是否對某個表進行壓縮,你需要進行試驗,可以對比未壓縮與壓縮后的數(shù)據(jù)文件的大小,以及監(jiān)控系統(tǒng)對于壓縮表的工作負載進行決定。具體試驗請查看第二部分。

查看監(jiān)控壓縮表的負載,如下:

對于簡單的測試,如一個mysql實例上沒有其他的壓縮表了,直接查詢INFORMATION_SCHEMA.INNODB_CMP表數(shù)據(jù)即可,該表存一些壓縮表的數(shù)據(jù)狀態(tài),結(jié)構(gòu)如下:

Column nameDescription
PAGE_SIZE采用壓縮頁大?。ㄗ止?jié)數(shù)).
COMPRESS_OPSNumber of times a B-tree page of the size PAGE_SIZE has been compressed. Pages are compressed whenever an empty page is created or the space for the uncompressed modification log runs out.
COMPRESS_OPS_OKNumber of times a B-tree page of the size PAGE_SIZE has been successfully compressed. This count should never exceed COMPRESS_OPS.
COMPRESS_TIMETotal time in seconds spent in attempts to compress B-tree pages of the size PAGE_SIZE.
UNCOMPRESS_OPSNumber of times a B-tree page of the size PAGE_SIZE has been uncompressed. B-tree pages are uncompressed whenever compression fails or at first access when the uncompressed page does not exist in the buffer pool.
UNCOMPRESS_TIMETotal time in seconds spent in uncompressing B-tree pages of the size PAGE_SIZE.
  • 對于精細的測試,如多個壓縮表,查詢INFORMATION_SCHEMA.INNODB_CMP_PER_INDEX表數(shù)據(jù),由于該表收集數(shù)據(jù)需要付出昂貴得代價,所以必須啟動innodb_cmp_per_index_enabled選項才能查詢。一般不要在生產(chǎn)環(huán)境下開啟該選項。
  • 還可以針對壓縮運行一些測試SQL看看效率如何。
  • 如果發(fā)現(xiàn)很多壓縮失敗,那么你可以調(diào)整innodb_compression_level, innodb_compression_failure_threshold_pct, 和innodb_compression_pad_pct_max參數(shù)。

3、數(shù)據(jù)庫壓縮和應(yīng)用程序壓縮

不需要在應(yīng)用端和數(shù)據(jù)庫同時壓縮相同的數(shù)據(jù),那樣效果并不明顯而且還消耗很多CPU資源。對于數(shù)據(jù)庫壓縮,是在server端進行的。如果你在插入數(shù)據(jù)前通過代碼進行數(shù)據(jù)壓縮,然后插入數(shù)據(jù)庫,這樣耗費很多CPU資源,當(dāng)然如果你的CPU有大量結(jié)余。你也可以結(jié)合兩者,對于某些表進行應(yīng)用程序壓縮,而對其他數(shù)據(jù)采用數(shù)據(jù)庫壓縮。

4、工作負載特性和壓縮率

為了選擇哪些表可以使用壓縮,工作負載是另一個決定因素,一般而言,如果你的系統(tǒng)是I/O瓶頸,那么可以使用CPU進行壓縮與解壓縮,以CPU換取I/O。

四、INNODB表是如何壓縮的?

1、壓縮算法

mysql進行壓縮是借助于zlib庫,采用L777壓縮算法,這種算法在減少數(shù)據(jù)大小、CPU利用方面是成熟的、健壯的、高效的。同時這種算法是無失真的,因此原生的未壓縮的數(shù)據(jù)總是能夠從壓縮文件中重構(gòu),LZ777實現(xiàn)原理是查找重復(fù)數(shù)據(jù)的序列號然后進行壓縮,所以數(shù)據(jù)模式?jīng)Q定了壓縮效率,一般而言,用戶的數(shù)據(jù)能夠被壓縮50%以上。

不同于應(yīng)用程序壓縮或者其他數(shù)據(jù)庫系統(tǒng)的壓縮,InnoDB壓縮是同時對數(shù)據(jù)和索引進行壓縮,很多情況下,索引能夠占數(shù)據(jù)庫總大小的40%-50%。如果壓縮效果很好,一般innodb文件會減少25%-50%或者更多,而且減少I/O增加系統(tǒng)吞吐量,但是會增加CPU的占用,你可通過設(shè)置innodb_compression_level參數(shù)來平衡壓縮級別和CPU占用。

2、InnoDB數(shù)據(jù)存儲及壓縮

所有數(shù)據(jù)和b-tree索引都是按頁進行存儲的,每行包含主鍵和表的其他列。輔助索引也是b-tree結(jié)構(gòu)的,包含對值:索引值及指向每行記錄的指針,這個指針實際上就是表的主鍵值。

在innodb壓縮表中,每個壓縮頁(1,2,4,8)都對應(yīng)一個未壓縮的頁16K,為了訪問壓縮頁中的數(shù)據(jù),如果該頁在buffer pool中不存在,那么就從硬盤上讀到這個壓縮頁,然后進行解壓到原來的數(shù)據(jù)結(jié)構(gòu)。為了最小化I/O和減少解壓頁的次數(shù),有時,buffer pool中包括壓縮和未壓縮的頁,為給其他頁騰出地方,buffer pool會驅(qū)逐未壓縮頁,僅僅留下壓縮頁在內(nèi)存中?;蛘呷绻粋€頁一段時間沒有被訪問,那么會被寫到硬盤上。這樣一來,任何時候,buffer pool中都可以包含壓縮頁和未壓縮頁,或者只有壓縮頁或者兩者都沒有。

Mysql采用LRU算法來保證哪些頁應(yīng)該在內(nèi)存中還是被驅(qū)逐。因此熱數(shù)據(jù)一般都會在內(nèi)存中。

五、OLTP系統(tǒng)壓縮負載優(yōu)化

一般而言,innodb壓縮對于只讀或者讀比重比較多的應(yīng)用效果更好,SSD的出現(xiàn),使得壓縮更加吸引我們,尤其對于OLTP系統(tǒng)。對于經(jīng)常update、delete、insert的應(yīng)用,通過壓縮表能夠減少他們的存儲需求和每秒I/O操作。

下面是針對寫密集的應(yīng)用,設(shè)置壓縮表的一些有用參數(shù):

  • innodb_compression_level:決定壓縮程度的參數(shù),如果你設(shè)置比較大,那么壓縮比較多,耗費的CPU資源也較多;相反,如果設(shè)置較小的值,那么CPU占用少。默認值6,可以設(shè)置0-9
  • innodb_compression_failure_threshold_pct:默認值5,范圍0到100.設(shè)置中斷點避免高昂的壓縮失敗率。
  • innodb_compression_pad_pct_max:指定在每個壓縮頁面可以作為空閑空間的最大比例,該參數(shù)僅僅應(yīng)用在設(shè)置了
  • innodb_compression_failure_threshold_pct不為零情況下,并且壓縮失敗率通過了中斷點。默認值50,可以設(shè)置范圍是0到75.

【第二部分】實驗:

#沒有設(shè)置壓縮前的數(shù)據(jù)大小
-rw-rw----. 1 mysql mysql 368M 12月 29 11:05 test.ibd
#設(shè)置KEY_BLOCK_SIZE=1
(product)root@localhost [sakila]> alter table test KEY_BLOCK_SIZE=1;
Query OK, 0 rows affected (14 min 49.30 sec)
Records: 0  Duplicates: 0  Warnings: 0
-rw-rw----. 1 mysql mysql 204M 1月  11 21:43 test.ibd      #####壓縮率44.5%
#設(shè)置KEY_BLOCK_SIZE=2
(product)root@localhost [sakila]> alter table test KEY_BLOCK_SIZE=2;
Query OK, 0 rows affected (9 min 55.60 sec)
Records: 0  Duplicates: 0  Warnings: 0
-rw-rw----. 1 mysql mysql 180M 1月  12 13:40 test.ibd      #####壓縮率51%
     
#設(shè)置KEY_BLOCK_SIZE=4
(product)root@localhost [sakila]> alter table test KEY_BLOCK_SIZE=4;
Query OK, 0 rows affected (7 min 24.52 sec)
Records: 0  Duplicates: 0  Warnings: 0
-rw-rw----. 1 mysql mysql 172M 1月  11 21:09 test.ibd      #####壓縮率53.2%
#設(shè)置KEY_BLOCK_SIZE=8
(product)root@localhost [sakila]> alter table test KEY_BLOCK_SIZE=8;
Query OK, 0 rows affected (5 min 16.34 sec)
Records: 0  Duplicates: 0  Warnings: 0
-rw-rw----. 1 mysql mysql 172M 1月  11 21:00 test.ibd      #####壓縮率53.2%
#設(shè)置KEY_BLOCK_SIZE=16
(product)root@localhost [sakila]> alter table test KEY_BLOCK_SIZE=16;
Query OK, 0 rows affected (2 min 47.48 sec)
Records: 0  Duplicates: 0  Warnings: 0
-rw-rw----. 1 mysql mysql 336M 1月  12 13:54 test.ibd      #####壓縮率8.6%

【總結(jié)】:通過以上測試可知,當(dāng)KEY_BLOCK_SIZE的值設(shè)置為4或者8時,壓縮效果最好,設(shè)置為16效果最差,因為頁的默認值16K。通常我是設(shè)置為8。

到此這篇關(guān)于mysql表數(shù)據(jù)壓縮的文章就介紹到這了,更多相關(guān)mysql表數(shù)據(jù)壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL 不等于的三種使用及區(qū)別

    MySQL 不等于的三種使用及區(qū)別

    MySQL中常用到判斷符號,而不等于是比較常用的符號,不等于主要是三種,本文主要介紹了三種的使用及區(qū)別,感興趣的同學(xué)可以了解一下
    2021-06-06
  • mysql中replace into與insert into區(qū)別

    mysql中replace into與insert into區(qū)別

    本文主要介紹了mysql中replace into與insert into區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Mysql 忘記root密碼的完美解決方法

    Mysql 忘記root密碼的完美解決方法

    通常在使用Mysql數(shù)據(jù)庫時,如果長時間沒有登陸,或者由于工作交接完成度不高,會導(dǎo)致數(shù)據(jù)庫root登陸密碼忘記,本文給大家介紹一種當(dāng)忘記mysql root密碼時的解決辦法,一起看看吧
    2016-12-12
  • MySql主從復(fù)制機制全面解析

    MySql主從復(fù)制機制全面解析

    這篇文章主要介紹了MySql主從復(fù)制機制全面解析的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-04-04
  • 避坑:Sql中?in?和not?in中有null值的情況說明

    避坑:Sql中?in?和not?in中有null值的情況說明

    這篇文章主要介紹了避坑:Sql中?in?和not?in中有null值的情況說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Mysql表的七種類型詳細介紹

    Mysql表的七種類型詳細介紹

    Mysql表類型都有哪些是一定需要知道的,下面就為您介紹七種Mysql表類型,希望能對您學(xué)習(xí)Mysql表類型有所幫助,需要的朋友可以了解下
    2012-11-11
  • mysql、oracle默認事務(wù)隔離級別的說明

    mysql、oracle默認事務(wù)隔離級別的說明

    這篇文章主要介紹了mysql、oracle默認事務(wù)隔離級別的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • MySql恢復(fù)數(shù)據(jù)方法梳理講解

    MySql恢復(fù)數(shù)據(jù)方法梳理講解

    MySQL的binlog日志是MySQL日志中非常重要的一種日志,下面這篇文章主要給大家介紹了關(guān)于mysql如何利用binlog進行數(shù)據(jù)恢復(fù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • SQL分頁查詢存儲過程代碼分享

    SQL分頁查詢存儲過程代碼分享

    本文主要分享了SQL分頁查詢存儲過程的具體實例代碼,具有一定的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • Mysql錯誤Every derived table must have its own alias解決方法

    Mysql錯誤Every derived table must have its own alias解決方法

    這篇文章主要介紹了Mysql錯誤Every derived table must have its own alias解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論

济南市| 郎溪县| 淄博市| 新绛县| 镇雄县| 成安县| 武邑县| 会东县| 延川县| 吉木乃县| 上蔡县| 沙坪坝区| 汾西县| 霍林郭勒市| 莎车县| 台湾省| 双柏县| 岳阳市| 宁都县| 门头沟区| 鹤岗市| 汾西县| 合水县| 文山县| 黄石市| 宁安市| 彰化县| 曲阜市| 贵溪市| 高邑县| 黄陵县| 石台县| 孟村| 南召县| 和龙市| 深水埗区| 武穴市| 额敏县| 无为县| 贵阳市| 叶城县|