千家信息网

MySQL5.7中有哪些新特性

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,本篇内容主要讲解"MySQL5.7中有哪些新特性",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"MySQL5.7中有哪些新特性"吧!1、介绍mysql5.7
千家信息网最后更新 2024年09月22日MySQL5.7中有哪些新特性

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

点击(此处)折叠或打开

  1. static

  2. byte*

  3. os_file_compress_page(

  4. Compression compression,

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

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

  7. ulint src_len,//页大小

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

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

  10. {

  11. ulint len = 0;

  12. ulint compression_level = page_zip_level;

  13. ulint page_type = mach_read_from_2(src + FIL_PAGE_TYPE);


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

  15. if (page_type == FIL_PAGE_RTREE

  16. || block_size == ULINT_UNDEFINED

  17. || compression.m_type == Compression::NONE

  18. || src_len < block_size * 2) {


  19. *dst_len = src_len;


  20. return(src);

  21. }


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

  23. ulint out_len = src_len - (FIL_PAGE_DATA + block_size);


  24. /* This is the original data page size - the page header. */

  25. ulint content_len = src_len - FIL_PAGE_DATA;


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


  27. switch (compression.m_type) {

  28. case Compression::NONE:

  29. ut_error;


  30. case Compression::ZLIB: {


  31. uLongf zlen = static_cast(out_len);


  32. if (compress2(

  33. dst + FIL_PAGE_DATA,

  34. &zlen,

  35. src + FIL_PAGE_DATA,

  36. static_cast(content_len),

  37. static_cast(compression_level)) != Z_OK) {


  38. *dst_len = src_len;


  39. return(src);

  40. }


  41. len = static_cast(zlen);


  42. break;

  43. }


  44. case Compression::LZ4:


  45. len = LZ4_compress_default(

  46. reinterpret_cast(src) + FIL_PAGE_DATA,

  47. reinterpret_cast(dst) + FIL_PAGE_DATA,

  48. static_cast(content_len),

  49. static_cast(out_len));


  50. if (len == 0 || len >= out_len) {


  51. *dst_len = src_len;


  52. return(src);

  53. }


  54. break;


  55. default:

  56. *dst_len = src_len;

  57. return(src);

  58. }


  59. /* Copy the header as is. */

  60. memmove(dst, src, FIL_PAGE_DATA);


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

  62. mach_write_to_2(dst + FIL_PAGE_TYPE, FIL_PAGE_COMPRESSED);


  63. mach_write_to_1(dst + FIL_PAGE_VERSION, 1);


  64. mach_write_to_1(dst + FIL_PAGE_ALGORITHM_V1, compression.m_type);


  65. mach_write_to_2(dst + FIL_PAGE_ORIGINAL_TYPE_V1, page_type);


  66. mach_write_to_2(dst + FIL_PAGE_ORIGINAL_SIZE_V1, content_len);


  67. mach_write_to_2(dst + FIL_PAGE_COMPRESS_SIZE_V1, len);


  68. /* Round to the next full block size */


  69. len += FIL_PAGE_DATA;


  70. *dst_len = ut_calc_align(len, block_size);


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

  72. if (len % block_size) {

  73. memset(dst + len, 0x0, block_size - (len % block_size));

  74. }


  75. return(dst);

  76. }

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

0