加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

使用zstd算法实现innodb的透明页压缩

(2022-09-24 18:03:10)
标签:

mysql

分类: mysql源码相关
目前innodb的透明也压缩只支持使用压缩算法zlib或lz4. 参考https://zhuanlan.zhihu.com/p/398959136可知:zstd算法相比zlib来说可以提供相当或略好的压缩比,并且可以提供明显优势的压缩速度和解压速度。

实际上mysql8.0在binlog的压缩实现中就已经选用了zstd算法,参考参数binlog_transaction_compression_level_zstd,并且zstd-1.5的源码已经作为mysql 源码目录extra/zstd的一部分了;所以使用zstd做透明页压缩是安全并且很容易实现。

最主要就是压缩和解压两处实现:
1. 压缩
代码路径:storage/innobase/os/os0file.cc
主要函数:os_file_compress_page
主要代码实现:
212 +    case Compression::ZSTD: {
213 +      size_t csize = ZSTD_compress(dst + FIL_PAGE_DATA, static_cast(out_len), src + FIL_PAGE_DATA, static_cast(content_len), page_zstd_level);
214 +      if (ZSTD_isError(csize)) {
215 +        *dst_len = src_len;
216 +        return (src);
217 +      }
218 +
219 +      len = static_cast(csize);
220 +      break;
221 +    }
222 +
可见patch的213行调用ZSTD_compress进行页压缩。

2. 解压缩
代码路径:storage/innobase/os/file.cc
主要函数:Compression::deserialize
主要代码实现:
139 +    case Compression::ZSTD: {
140 +      size_t csize = ZSTD_decompress(dst, header.m_original_size, ptr, header.m_compressed_size);
141 +      if (ZSTD_isError(csize)) {
142 +        if (allocated) {
143 +          ut::free(dst);
144 +        }
145 +        return (DB_IO_DECOMPRESS_FAIL);
146 +      }
147 +      ut_ad(static_cast(csize) <= len);
148 +      len = static_cast(csize);
149 +      break;
150 +    }
可见patch的140行调用ZSTD_decompress进行页解压缩。

其他的代码主要是增加参数和Compression::ZSTD这个新压缩类型。完整patch可以参考我提供官方的patch: https://bugs.mysql.com/bug.php?id=108604&thanks=6&notify=3

转载请注明转自高孝鑫的博客!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有