MySQL5.7中有哪些新特性

本篇内容主要讲解“MySQL5.7中有哪些新特性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL5.7中有哪些新特性”吧!

1、介绍

mysql5.7中,innodb页结构增加了一个类型FIL_PAGE_COMPRESSED,用来完成Transparent page compression 特性

2、说明

1)压缩内容包括:除去FIL_PAGE_DATA外所有数据,包括tail
2)压缩后的内容+FIL_PAGE_DATA会以block_size对齐,并将空洞清0。意味着将16K压缩到9K,也需要12KB的数据,因此将block_size设小点,这样的场景将受益,可以
   减少空间浪费。
3)FIL_PAGE_VERSION内容存1;FIL_PAGE_ALGORITHM_V1指哪个压缩算法:ZLIB、LZ4
   FIL_PAGE_ORIGINAL_TYPE_V1:原始页类型;
   FIL_PAGE_ORIGINAL_SIZE_V1:原始页需要压缩的内容大小
   FIL_PAGE_COMPRESS_SIZE_V1:内容压缩后大小
4)目前支持2种压缩算法:zlib和lz4,可以方便扩展新的算法
5)压缩只是在持久化磁盘的时候压缩,内存中的页仍然是原始的样子

3、用法

表定义:
可以通过CREATE TABLE、ALTER TABLE来定义压缩表:
  create table t1(i int,b blob) compression='zlib';
也可以选择compression='lz4'来指定lz4压缩算法,注意compression属性的ALTER是立即生效,在做完ALTER COMPRESSION属性操作后,需要做一次表的rebuild,例如optimize table操作,才能对已有的数据做punch hole。compression属性存储在frm文件中,以2个字节存储字符串长度,随后存储compression属性定义字符串,这也是一个操作系统降级的风险点。

4、代码分析


点击(此处)折叠或打开

  1. static


  2. byte*


  3. os_file_compress_page(


  4.     Compression    compression,


  5.     ulint        block_size,//文件系统block大小。通常4K


  6.     byte*        src,//需要压缩页的指针


  7.     ulint        src_len,//页大小


  8.     byte*        dst,//压缩后,存入目标


  9.     ulint*        dst_len)//压缩内存长度

  10. {


  11.     ulint        len = 0;


  12.     ulint        compression_level = page_zip_level;


  13.     ulint        page_type = mach_read_from_2(src + FIL_PAGE_TYPE);



  14.     //如果要节省空间,页大小至少是文件系统block的2倍。压缩的页不包括R-tree页


  15.     if (page_type == FIL_PAGE_RTREE


  16.      || block_size == ULINT_UNDEFINED


  17.      || compression.m_type == Compression::NONE


  18.      || src_len < block_size * 2) {



  19.         *dst_len = src_len;



  20.         return(src);


  21.     }



  22.     /* Must compress to <= N-1 FS blocks. */


  23.     ulint        out_len = src_len – (FIL_PAGE_DATA + block_size);



  24.     /* This is the original data page size – the page header. */


  25.     ulint        content_len = src_len – FIL_PAGE_DATA;



  26.     /* Only compress the data + trailer, leave the header alone */



  27.     switch (compression.m_type) {


  28.     case Compression::NONE:


  29.         ut_error;



  30.     case Compression::ZLIB: {



  31.         uLongf    zlen = static_cast<uLongf>(out_len);



  32.         if (compress2(


  33.             dst + FIL_PAGE_DATA,


  34.             &zlen,


  35.             src + FIL_PAGE_DATA,


  36.             static_cast<uLong>(content_len),


  37.             static_cast<int>(compression_level)) != Z_OK) {



  38.             *dst_len = src_len;



  39.             return(src);


  40.         }



  41.         len = static_cast<ulint>(zlen);



  42.         break;


  43.     }



  44.     case Compression::LZ4:



  45.         len = LZ4_compress_default(


  46.             reinterpret_cast<char*>(src) + FIL_PAGE_DATA,


  47.             reinterpret_cast<char*>(dst) + FIL_PAGE_DATA,


  48.             static_cast<int>(content_len),


  49.             static_cast<int>(out_len));



  50.         if (len == 0 || len >= out_len) {



  51.             *dst_len = src_len;



  52.             return(src);


  53.         }



  54.         break;



  55.     default:


  56.         *dst_len = src_len;


  57.         return(src);


  58.     }



  59.     /* Copy the header as is. */


  60.     memmove(dst, src, FIL_PAGE_DATA);



  61.     /* Add compression control information. Required for decompressing. */


  62.     mach_write_to_2(dst + FIL_PAGE_TYPE, FIL_PAGE_COMPRESSED);



  63.     mach_write_to_1(dst + FIL_PAGE_VERSION, 1);



  64.     mach_write_to_1(dst + FIL_PAGE_ALGORITHM_V1, compression.m_type);



  65.     mach_write_to_2(dst + FIL_PAGE_ORIGINAL_TYPE_V1, page_type);



  66.     mach_write_to_2(dst + FIL_PAGE_ORIGINAL_SIZE_V1, content_len);



  67.     mach_write_to_2(dst + FIL_PAGE_COMPRESS_SIZE_V1, len);



  68.     /* Round to the next full block size */



  69.     len += FIL_PAGE_DATA;



  70.     *dst_len = ut_calc_align(len, block_size);



  71.     /* Clear out the unused portion of the page. */


  72.     if (len % block_size) {


  73.         memset(dst + len, 0x0, block_size – (len % block_size));


  74.     }



  75.     return(dst);

  76. }

到此,相信大家对“MySQL5.7中有哪些新特性”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/204085.html

(0)
上一篇 2021年11月28日
下一篇 2021年11月28日

相关推荐

发表回复

登录后才能评论