How Compression Works for InnoDB Tables MySQL文档翻译:InnoDB表压缩工作原理
原文: [MySQL 5.7 Manual 15.9.1.5 How Compression Works for InnoDB Tables] https://dev.mysql.com/doc/refman/5.7/en/innodb-compression-internals.html 本节介绍关于InnoDB表的压缩的一些内部实现细节。 这里介绍的信息可能有助于性能调优,但对压缩功能的基本使用并不必要。 压缩算法 某些操作系统在文件系统级别实现压缩。文件通常被分为固定大小的块,这些块被压缩后大小不固定,很容易导致碎片化。当块内的内容被修改时,在被写入磁盘之前,整个块都要被重新压缩。这些特性使得这种压缩技术不适合在update密集型当数据库系统中使用。 MySQL利用了广为人知的zlib库(基于LZ77压缩算法)来实现压缩功能。这种压缩算法在CPU利用率和减小数据大小方面都是成熟,稳健和高效的。该算法是“无损”的,从而可以始终从压缩形式重构原始的未压缩数据。 LZ77压缩通过查找要压缩的数据中重复的数据序列来实现压缩的目的。数据的具体形式决定了它的压缩程度,典型的用户数据通常会压缩50%或更多。 与一个应用程序执行的压缩或某些其他数据库管理系统的压缩功能不同,InnoDB压缩既适用于用户数据又适用于索引数据。在许多情况下,索引可以构成总数据库大小的40-50%以上,所以这带来的差异是显著的。当压缩对于某个数据集工作良好时,InnoDB数据文件(file-per-table的表空间或一般的表空间.idb文件)的大小是未压缩大小的25%到50%或更小。根据工作负载,压缩后的较小的数据库反过来很可能导致I/O数的减少,并以适度增加CPU占用率为成本增大了吞吐量。你可以通过修改innodb_compression_level配置选项来调整压缩级别和CPU开销之间的平衡。 InnoDB数据存储和压缩 InnoDB表中的所有用户数据都存储在包含B树索引(聚簇索引, clustered index)的页面中。 在其他一些数据库系统中,这种类型的索引称为“索引组织表”。 索引节点中的每一行都包含(用户指定的或系统生成的)主键和表的所有其他列的值。 InnoDB表中的辅助索引(secondary indexes)也是B树,包含键值对:索引键和指向聚簇索引中的某个行的指针。 指针实际上是表的主键的值,在需要除索引键和主键之外的列时,则需要查找到该值用来访问聚簇索引,进而访问到需要的列。 辅助索引记录必须始终可以放在单个B树页面。