使用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¬ify=3
转载请注明转自高孝鑫的博客!