mysql5.7中,innodb页结构增加了一个类型FIL_PAGE_COMPRESSED,用来完成Transparent page compression 特性
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中有哪些新特性”有了更深的了解,不妨来实际操作一番吧!这里是天达云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!