November 18, 2012

[MySQL 学习] zlib库相关结构和函数

以下主要是阅读zlib库时,对库函数的注释的翻译,也是为了帮助理解zlib在innodb压缩表中的应用 这里只考虑了Innodb用到的函数,其他的具体参考zlib.h文件,里面的注释写的非常详细 ————————- 1.主要用到的结构体是z_stream,定义在文件zlib/zlib.h中,我们需要去定义的字段包括 Bytef    *next_in 输入的源字符串 uInt     avail_in 输入源字符串长度,当avail_in下降到0时,必须更新next_in和avail_in Bytef    *next_out 输出字符串 uInt     avail_out 在next_out中的可用空闲空间,当avail_out下降到0时,必须更新next_out alloc_func zalloc 内存分配函数,Innodb里对应的函数指针是page_zip_zalloc 如不指定需要设置为NULL free_func  zfree 内存释放函数,Innodb里对应函数指针为page_zip_free 如不指定需要设置为NULL voidpf     opaque 会被作为参数传递给zalloc和zfree,在innodb里使用的是mem_heap. 2.压缩函数(只涉及到Innodb中的调用) a.deflateInit2(strm, level, method, windowBits, memLevel, strategy) 参数 @1, z_stream对象 @2,压缩级别 @3,值为Z_DEFLATED,当前唯一的defalte压缩方法,用于以后扩展 @4,窗口比特数,范围在8~15,更大的值意味着消耗更多的内存来获得更好的压缩效果,如果使用deflateInit来初始化的话默认值为15 windowBits也可以在-8~-15间赋值,用于raw deflate(不理解?),这时候使用-windowsBits来决定窗口大小,deflate()会生成raw deflate data,没有zlib头和尾,并且也不会去调用adler32 当使用gzlib编码时,windowsbits也可以设置为大于15,但跟zlib的文件格式会有很大的不同。 在Innodb中值为UNIV_PAGE_SIZE_SHIFT,值为14(如果Page Size为默认16K的话) @5,memlevel用于指定分配多少内存用于内部的压缩状态,值为1将使用最小的内存但更慢并降低压缩比;memlevel值为9时,会使用最大内存来获得最快的速度。默认值为8,在Innodb里使用的值为MAX_MEM_LEVEL,deflate需要的内存为: […]