MySQL5.7中有哪些新特性

62次阅读
没有评论

共计 2940 个字符,预计需要花费 8 分钟才能阅读完成。

本篇内容主要讲解“MySQL5.7 中有哪些新特性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“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、代码分析

点击 (此处) 折叠或打开

static

byte*

os_file_compress_page(

 Compression compression,

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

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

 ulint src_len,// 页大小

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

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

{

 ulint len = 0;

 ulint compression_level = page_zip_level;

 ulint page_type = mach_read_from_2(src + FIL_PAGE_TYPE);

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

 if (page_type == FIL_PAGE_RTREE

  || block_size == ULINT_UNDEFINED

  || compression.m_type == Compression::NONE

  || src_len block_size * 2) {

 *dst_len = src_len;

 return(src);

 }

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

 ulint out_len = src_len – (FIL_PAGE_DATA + block_size);

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

 ulint content_len = src_len – FIL_PAGE_DATA;

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

 switch (compression.m_type) {

 case Compression::NONE:

 ut_error;

 case Compression::ZLIB: {

 uLongf zlen = static_cast uLongf (out_len);

 if (compress2(

 dst + FIL_PAGE_DATA,

  zlen,

 src + FIL_PAGE_DATA,

 static_cast uLong (content_len),

 static_cast int (compression_level)) != Z_OK) {

 *dst_len = src_len;

 return(src);

 }

 len = static_cast ulint (zlen);

 break;

 }

 case Compression::LZ4:

 len = LZ4_compress_default(

 reinterpret_cast char* (src) + FIL_PAGE_DATA,

 reinterpret_cast char* (dst) + FIL_PAGE_DATA,

 static_cast int (content_len),

 static_cast int (out_len));

 if (len == 0 || len = out_len) {

 *dst_len = src_len;

 return(src);

 }

 break;

 default:

 *dst_len = src_len;

 return(src);

 }

 /* Copy the header as is. */

 memmove(dst, src, FIL_PAGE_DATA);

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

 mach_write_to_2(dst + FIL_PAGE_TYPE, FIL_PAGE_COMPRESSED);

 mach_write_to_1(dst + FIL_PAGE_VERSION, 1);

 mach_write_to_1(dst + FIL_PAGE_ALGORITHM_V1, compression.m_type);

 mach_write_to_2(dst + FIL_PAGE_ORIGINAL_TYPE_V1, page_type);

 mach_write_to_2(dst + FIL_PAGE_ORIGINAL_SIZE_V1, content_len);

 mach_write_to_2(dst + FIL_PAGE_COMPRESS_SIZE_V1, len);

 /* Round to the next full block size */

 len += FIL_PAGE_DATA;

 *dst_len = ut_calc_align(len, block_size);

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

 if (len % block_size) {

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

 }

 return(dst);

}

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计2940字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)