1. 程式人生 > >information_schema系列十一

information_schema系列十一

hold ESS perf ava 復數 效率 add 並且 相關

1: INNODB_CMP 和INNODB_CMP_RESET 這兩個表存儲的是關於壓縮INNODB信息表的時候的相關信息,
Column name Description
PAGE_SIZE Compressed page size in bytes.
COMPRESS_OPS Number 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_OK Number of times a B-tree page of the size PAGE_SIZE has been successfully compressed. This count should never exceed COMPRESS_OPS.
COMPRESS_TIME Total time in seconds spent in attempts to compress B-tree pages of the size PAGE_SIZE.
UNCOMPRESS_OPS Number 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_TIME Total time in seconds spent in uncompressing B-tree pages of the size PAGE_SIZE.
這幾個表主要就是看我們的壓縮是不是有效,必須有PEOCESS的權限才可以查看這兩張表. 在這剛好補充一下表壓縮的知識: 在創建innodb表時帶上ROW_FORMAT=COMPRESSED參數能夠使用比默認的16K更小的頁。這樣在讀寫時需要更少的I/O,對於SSD磁盤更有價值,頁的大小通過KEY_BLOCK_SIZE參數指定。不同大小的頁意味著需要使用獨立表空間,不能使用系統共享表空間,可以通過innodb_file_per_table指定。KEY_BLOCK_SIZE的值越小,你獲得I/O好處就越多,但是如果因為你指定的值太小,當數據被壓縮到不足夠滿足每頁多行數據記錄時,會產生額外的開銷來重組頁。對於一個表,KEY_BLOCK_SIZE的值有多小是有嚴格的限制的,一般是基於每個索引鍵的長度。有時指定值過小,當create table或者alter table會失敗。 在緩沖池中,被壓縮的數據是存儲在小頁中的,這個小頁的實際大小就是KEY_BLOCK_SIZE的值。為了提取和更新列值,mysql也會在緩沖池中創建一個未壓縮的16k頁。任何更新到未壓縮的頁也需要重新寫入到壓縮的頁,這時你需要估計緩沖池的大小以滿足壓縮和未壓縮的頁,盡管當緩沖空間不足時,未壓縮的頁會被擠出緩沖池。在下次訪問時,不壓縮的頁還會被創建。 看個例子:
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的值,你可以創建表的多個副本,使用不同的值進行測試,比較他們的.ibd文件的大小;
  • KEY_BLOCK_SIZE的值作為一種提示,如必要,Innodb也可以使用一個不同的值。0代表默認壓縮頁的值,Innodb頁的一半。KEY_BLOCK_SIZE的值只能小於等於innodb page size。如果你指定了一個大於innodb page size的值,mysql會忽略這個值然後產生一個警告,這時KEY_BLOCK_SIZE的值是Innodb頁的一半。如果設置了innodb_strict_mode=ON,那麽指定一個不合法的KEY_BLOCK_SIZE的值是返回報錯。
InnoDB未壓縮的數據頁是16K,根據選項組合值,mysql為每個表的.ibd文件使用1kb,2kb,4kb,8kb,16kb頁大小,實際的壓縮算法並不會受KEY_BLOCK_SIZE值影響,這個值只是決定每個壓縮塊有多大,從而影響多少行被壓縮到每個頁。設置KEY_BLOCK_SIZE值等於16k並不能有效的進行壓縮,因為默認的innodb頁就是16k,但是對於擁有很多BLOB,TEXT,VARCHAR類型字段的表可能會有效果的。 一般而言,對於讀遠遠大於寫的應用以及擁有合理數量的字符串列的表,使用壓縮效果會更好。 四、INNODB表是如何壓縮的? 1、壓縮算法 mysql進行壓縮是借助於zlib庫,采用L777壓縮算法,這種算法在減少數據大小、CPU利用方面是成熟的、健壯的、高效的。同時這種算法是無失真的,因此原生的未壓縮的數據總是能夠從壓縮文件中重構,LZ777實現原理是查找重復數據的序列號然後進行壓縮,所以數據模式決定了壓縮效率,一般而言,用戶的數據能夠被壓縮50%以上。 不同於應用程序壓縮或者其他數據庫系統的壓縮,InnoDB壓縮是同時對數據和索引進行壓縮,很多情況下,索引能夠占數據庫總大小的40%-50%。如果壓縮效果很好,一般innodb文件會減少25%-50%或者更多,而且減少I/O增加系統吞吐量,但是會增加CPU的占用,你可通過設置innodb_compression_level參數來平衡壓縮級別和CPU占用。 2、InnoDB數據存儲及壓縮 所有數據和b-tree索引都是按頁進行存儲的,每行包含主鍵和表的其他列。輔助索引也是b-tree結構的,包含對值:索引值及指向每行記錄的指針,這個指針實際上就是表的主鍵值。 在innodb壓縮表中,每個壓縮頁(1,2,4,8)都對應一個未壓縮的頁16K,為了訪問壓縮頁中的數據,如果該頁在buffer pool中不存在,那麽就從硬盤上讀到這個壓縮頁,然後進行解壓到原來的數據結構。為了最小化I/O和減少解壓頁的次數,有時,buffer pool中包括壓縮和未壓縮的頁,為給其他頁騰出地方,buffer pool會驅逐未壓縮頁,僅僅留下壓縮頁在內存中。或者如果一個頁一段時間沒有被訪問,那麽會被寫到硬盤上。這樣一來,任何時候,buffer pool中都可以包含壓縮頁和未壓縮頁,或者只有壓縮頁或者兩者都沒有。 Mysql采用LRU算法來保證哪些頁應該在內存中還是被驅逐。因此熱數據一般都會在內存中。 五、OLTP系統壓縮負載優化 一般而言,innodb壓縮對於只讀或者讀比重比較多的應用效果更好,SSD的出現,使得壓縮更加吸引我們,尤其對於OLTP系統。對於經常update、delete、insert的應用,通過壓縮表能夠減少他們的存儲需求和每秒I/O操作。 下面是針對寫密集的應用,設置壓縮表的一些有用參數:
  • innodb_compression_level:決定壓縮程度的參數,如果你設置比較大,那麽壓縮比較多,耗費的CPU資源也較多;相反,如果設置較小的值,那麽CPU占用少。默認值6,可以設置0-9
  • innodb_compression_failure_threshold_pct:默認值5,範圍0到100.設置中斷點避免高昂的壓縮失敗率。
  • innodb_compression_pad_pct_max:指定在每個壓縮頁面可以作為空閑空間的最大比例,該參數僅僅應用在設置了innodb_compression_failure_threshold_pct不為零情況下,並且壓縮失敗率通過了中斷點。默認值50,可以設置範圍是0到75.
可以使用以下語句進行壓縮.
alter table test KEY_BLOCK_SIZE=1|2|4|8|16;

設置的越小,壓縮比例就會越大,但是會帶來額外的開銷,一般建議8K.

2:INNODB_CMP_PER_INDEX和INNODB_CMP_PER_INDEX_RESET 這兩個表存儲的是關於壓縮INNODB信息表的時候的相關信息,有關整個表和索引信息都有.我們知道對於一個INNODB壓縮表來說,不管是數據還是二級索引都是會被壓縮的,因為數據本身也可以看作是一個聚集索引.
Column name Description
DATABASE_NAME 相關數據庫
TABLE_NAME 監控的壓縮表
INDEX_NAME 索引的名字
COMPRESS_OPS Number of compression operations attempted. Pages are compressed whenever an empty page is created or the space for the uncompressed modification log runs out.
COMPRESS_OPS_OK Number of successful compression operations. Subtract from the COMPRESS_OPS value to get the number of compression failures. Divide by the COMPRESS_OPS value to get the percentage of compression failures.
COMPRESS_TIME Total amount of CPU time, in seconds, used for compressing data in this index.
UNCOMPRESS_OPS Number of uncompression operations performed. Compressed InnoDB pages are uncompressed whenever compression fails, or the first time a compressed page is accessed in the buffer pool and the uncompressed page does not exist.
UNCOMPRESS_TIME Total amount of CPU time, in seconds, used for uncompressing data in this index.
但是要註意一點的就是,用這兩個表來收集所有信息的表的時候,是會對性能造成嚴重的影響的,所以說默認是關閉狀態的。如果要打開這個功能的話我們要設置以下參數為ON狀態。 innodb_cmp_per_index_enabled 3: INNODB_CMPMEM_RESET和 INNODB_CMPMEM 這兩個表是存放關於MySQL INNODB的壓縮頁的buffer pool信息。
Column name Description
PAGE_SIZE Block size in bytes. Each record of this table describes blocks of this size.
BUFFER_POOL_INSTANCE A unique identifier for the buffer pool instance.
PAGES_USED Number of blocks of the size PAGE_SIZE that are currently in use.
PAGES_FREE Number of blocks of the size PAGE_SIZE that are currently available for allocation. This column shows the external fragmentation in the memory pool. Ideally, these numbers should be at most 1.
RELOCATION_OPS Number of times a block of the size PAGE_SIZE has been relocated. The buddy system can relocate the allocated “buddy neighbor”of a freed block when it tries to form a bigger freed block. Reading from the table INNODB_CMPMEM_RESET resets this count.
RELOCATION_TIME Total time in microseconds spent in relocating blocks of the size PAGE_SIZE. Reading from the table INNODB_CMPMEM_RESETresets this count.

information_schema系列十一