MySQL中的表压缩功能

MySQL版本:8.0.22

os:linux ubuntu

语言:c++、c

在MySQL中支持3种类型的表压缩,依次为:传统压缩、TPC压缩、字典压缩。

第一种:传统压缩

传统的表压缩方式是在MySQL5.0.7之前使用的,现在已经废弃了,因为这种方式不但没有提升数据库的效率,反而降低了效率,导致buffer pool的使用率降低了。

create table时指定压缩后表的大小,即 KEY_BLOCK_SIZE 的大小,page默认大小为16KB。压缩是按page为单位进行压缩的。

SQL语句:

create table tt 
(c1 int primary key,c2 varchar(50)
) engine = innodb KEY_BLOCK_SIZE=8; KEY_BLOCK_SIZE 的取值为: 1,2,4,8,16

表示一个16KB的page压缩之后是8KB。如果一个page压缩之后的大小为9KB,那么需要2个8KB的page进行存储。如果一个page压缩之后的大小为6KB,那么只需要1个8KB的page进行存储即可。

KEY_BLOCK_SIZE的大小可以是 1、2、4、8、16,表示启用页压缩,然后按照 1K、2K、4K、8K、16K 的页大小存储数据。如果设置KEY_BLOCK_SIZE的大小为0,那么MySQL自动的将KEY_BLOCK_SIZE设置为innodb_page_size/2;

缺点:一个页在缓冲池中存在两个版本,压缩前的原始版本和压缩后的版本,这样导致缓冲池中能缓存page页的数量大大减少,在buffer pool中多产生一个page。对于一个16KB的page,一个存放的是原来的16KB的页数据,另一个是压缩后的page,压缩后以8KB为例,8KB中存放的是压缩后的数据再加上redo.log日志以及file header和file tailer部分。

因此,这种压缩方式会额外的多占用一个page用于存储压缩之后的page。

参考:MySQL :: MySQL 8.0 Reference Manual :: 15.9.1.2 Creating Compressed Tables

第二种:TPC压缩

TPC是Transparent page compression的简称,也就是 透明页压缩。这种方式是主流的压缩方式。

压缩是按page为单位进行压缩的,一个page的大小默认是16KB,也就是innodb page的默认大小,用于可以通过SQL : select @@innodb_page_size;查询page的大小;下面都采用一个page为16KB为单位。

SQL语句:

create table tt
(c1 int primary key,c2 varchar(128)
) engine = innodb compression=zlib;create table tt
(c1 int primary key,c2 varchar(128)
) engine = innodb compression=lz4;create table tt
(c1 int primary key,c2 varchar(128)
) engine = innodb compression=none;

建表时,compression=后面指定压缩的方式,支持下面3种写法:

COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}

其中zlib和lz4是支持的压缩方式,NONE表示不压缩

一个page变成dirty page之后,后台线程就会将该dirty page flush到磁盘文件中。确定要flush到磁盘文件时,先将该page进行压缩(lz4/zlib),压缩之后以9KB为例,那么剩余的7KB(16K-9K)就会被填充为0x00,然后flush到磁盘文件后,调用文件系统空洞(Hole Punch)特性(实际上是fallocate())对文件进行“裁剪”,释放 0x00 占用的稀疏空间,实际存放到磁盘上的文件大小为7KB。

当前linux的内核以及大部分的文件系统,例如:XFS、EXT4、ZFS、btrfs、NTFS 等,都支持文件空洞特性。

查看压缩后的文件占用的存储空间大小的SQL如下:

SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='mysql/bmsql_customer';

FILE_SIZE:表示原始文件的大小

ALLOCATED_SIZE:表示压缩之后的大小

压缩率 = ALLOCATED_SIZE / FILE_SIZE

 参考:MySQL :: MySQL 8.0 Reference Manual :: 15.9.2 InnoDB Page Compression

第三种:字典压缩

基于字典的列压缩又叫压缩字典,但只适用于Percona分支。
优点是压缩率高, 每个列的数据类型都相同;

限制条件:
该列压缩方式仅用于InnoDB/XtraDB存储引擎,数据类型支持:
(1)、BLOB (including TINYBLOB, MEDIUMBLOB, LONGBLOG)
(2)、TEXT (including TINYTEXT, MEDUUMTEXT, LONGTEXT)
(3)、VARCHAR (including NATIONAL VARCHAR)
(4)、VARBINARY
(5)、JSON
应用于不受支持的列类型或存储引擎,则会报错。

使用MySQL自带的压缩键功能时的SQL语句:
在创建表语句或更改表语句中增加压缩标识
(1)、CREATE语句

CREATE TABLE ... (..., foo BLOB COLUMN_FORMAT COMPRESSED, ...);


(2)、ALTER语句

ALTER TABLE ... CHANGE [COLUMN] ... COLUMN_FORMAT COMPRESSED;ALTER TABLE ... MODIFY [COLUMN] ... COLUMN_FORMAT COMPRESSED;

还有一种是用户自定义压缩键,也就是在在建表时指定压缩和压缩键。

SQL语句如下:

SET @dictionary_data = 'wall' 'apple' 'peach' 'orange';CREATE COMPRESSION_DICTIONARY numbers (@dictionary_data);CREATE TABLE tt(c1 INT,c2 text COLUMN_FORMAT COMPRESSED,c3 BLOB COLUMN_FORMAT COMPRESSED WITH COMPRESSION_DICTIONARY numbers) ENGINE=InnoDB;

c2采用MySQL默认的压缩键;

c3采用用户自定义的压缩键;

不过这种方式使用起来还是有争议的,如果用户用不好压缩键导致压缩率低。

其他参考文献:MySQL :: MySQL 8.0 Reference Manual :: 13.1.20 CREATE TABLE Statement

总之:

现在主流的压缩方式为:TPC压缩和基于字典键的压缩。

如有疑问请发邮件:zgaoq@163.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案

本文目录1. Net下日志记录2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 2.4 日志类型介绍 2.5 产生的日志文件3. 基于Microsoft.Extensions.Logging封装 3.1 添加引用Microsoft.Extensions.Logging 3.2 实现…

strcasecmp()--忽略大小写比较字符串

strcasecmp()的功能是&#xff1a;忽略大小写比较字符串 头文件 #include <strings.h> 函数原型&#xff1a;int strcasecmp(const char *s1, const char *s2); 函数功能: 用来比较参数s1和s2字符串&#xff0c;比较时会自动忽略大小写的差异。 返回值: 若参数字符串…

基于报文地址的策略路由配置示例

【实验拓扑】本文实验采用的交换机是H3C模拟器&#xff0c;下载地址如下&#xff1a; http://forum.h3c.com/forum.php? modviewthread&tid109740&highlightH3C%E6%A8%A1%E6% 8B%9F%E5%99%A8 有兴趣的朋 友可以在论坛上去下载 【组网需求】普通的报文转发是依据报文的…

MySQL单机版Recycle Bin回收站功能

最近调研了阿里的Recycle Bin回收站功能&#xff0c;可以保证数据不丢失。 为了防止开发或运维人员的误操作&#xff0c;比如DROP TABLE/DATABASE、TRUNCATE TABLE&#xff0c;这类DDL语句不具有可操作的回滚特性&#xff0c;而导致数据丢失,AliSQL 8.0(基于MySQL)新特性支持回…

用STATSVN统计公司SVN代码修改

直接用LOG&#xff0c;BOSS还是不满意&#xff0c;那只好架上JDK&#xff0c;用STATSVN了。 跑得还顺利&#xff0c;只是具体代码没跑出来。。 但共用一个帐号&#xff0c;害人呀&#xff0c;还好有提交注释里有程序员的名字。。 STATSVN文档很简单&#xff0c;简单报告也就一个…

MySQL源码解读之数据结构-LF_DYNARRAY

MySQL的代码中实现了一个Lock Free的Hash结构&#xff0c;称作LF_Hash。MySQL的不少模块使用了LF_Hash&#xff0c;比如Metadata Lock就依赖于它。但由于使用的方法不正确&#xff0c;导致了bug#98911和bug#98624。理解LF_Hash的实现细节&#xff0c;可以帮助我们用好LF_Hash。…

如何运行一个Vue项目

一开始很多刚入手vue.js的人&#xff0c;会扒GitHub上的开源项目&#xff0c;但是发现不知如何运行GitHub上的开源项目&#xff0c;很尴尬。通过查阅网上教程&#xff0c;成功搭建好项目环境&#xff0c;同时对前段工程化有了朦朦胧胧的认知&#xff0c;因此将环境搭建过程分享…

Hibernate初学之CURD

Hibernate初学之CURD 以前学过JDBC的增删改查&#xff0c;感觉挺方便的&#xff0c;用hibernate框架则会更加简便&#xff0c; 关于hibernate的增删改查模块&#xff0c;我感觉用代码解释再合适不过了&#xff1b; 首先是导包问题&#xff1a;应用hibernate需要导十个包&#x…

计算机网络读书笔记(1)

传输控制协议TCP最主要特点&#xff1a; 1、 面向连接的传输层协议&#xff0c;类似于打电话 2、 点对点&#xff08;一对一&#xff09;&#xff0c;每一条TCP只能有两个端点 3、 提供可靠交付的服务 4、 全双工通信 5、 面向字节流&#xff08;所谓流&#xff1a;流入到…

网卡驱动收发包过程图解

网卡 网卡工作在物理层和数据链路层&#xff0c;主要由PHY/MAC芯片、Tx/Rx FIFO、DMA等组成&#xff0c;其中网线通过变压器接PHY芯片、PHY芯片通过MII接MAC芯片、MAC芯片接PCI总线 PHY芯片主要负责&#xff1a;CSMA/CD、模数转换、编解码、串并转换 MAC芯片主要负责&#x…

在c++中,如果派生类没有重写基类中对应virtual函数会怎样?

在c中&#xff0c;如果一个派生类没有重写基类中对应的虚函数&#xff0c;那么在派生类的构造函数中依然会创建虚指针&#xff0c;但是该虚指针指向的是基类的虚表。 #include <iostream> #include <string>class Base { public:virtual void foo() {std::cout &l…

哪些类继承了Collection接口

Collection集合的基本结构&#xff1a; 1、Collection接口 Collection是最基本集合接口&#xff0c;它定义了一组允许重复的对象。Collection接口派生了两个子接口Set和List&#xff0c;分别定义了两种不同的存储方式&#xff0c;如下&#xff1a; 2、 Set接口 Set接口继承于Co…

在c++中一个空类占用的字节数

结论&#xff1a; 在c中一个空类占用&#xff1a;1Byte。 有的同学认为一个空类占0Byte&#xff0c;那么定义一个空类时&#xff0c;他存放到哪里呢&#xff1f;为此&#xff0c;在c编译器中&#xff0c;为空类设置了占用1Byte内存。 #include <iostream> // std::c…

使用Mule ESB与Groovy编排RESTful服务【转】很适合我们当前的架构

http://www.infoq.com/cn/articles/restful-services-mule 在过去几年中&#xff0c;REST风格的软件架构获得了越来越多的认可&#xff0c;这主要是因为它减少了系统对动件的需求、同时使系统耦合性更低&#xff0c;弹性更好。 目前越来越多的REST资源出现在企业应用中&#xf…

Starling框架帮助手册中文版(PDF下载)

什么是Statling&#xff1f;Starling 是一个基于Stage3D&#xff08;这是Flash Player11及Adobe AIR 3中新增的为3D加速功能所提供的API&#xff09;所开发的一个能够使用GPU来加速的2D Flash应用程序的ActionScript3框架。Starling主要是为游戏开发而设计的, 但是它的用途不仅…

园区网VLAN应用实例

园区环境&#xff1a;一台核心路由器&#xff0c;一台核心交换机&#xff1b;四台汇聚层交换机&#xff1b;四台接入层交换机&#xff08;可根据实际需求和带宽的大小增加接入层的数量&#xff09;——接入层下接入大量的PC机。技术要求&#xff1a;通过VLAN的划分及VTP的设置实…

GMF 教程 Mindmap 5

2019独角兽企业重金招聘Python工程师标准>>> 这一部分主要实现的是&#xff1a; 使用扩展的Plug-in为我们的Diagram添加一个自定义动作 Creating a Customization Plug-in 尽管可以给生成的代码添加备注generated NOT来避免下次重新生成代码时覆盖我们修改的代码…

Jmeter(四十二)_控制器下遍历一组参数

概述 在接口自动化的过程中&#xff0c;经常遇到需要遍历的参数组。jmeter在中&#xff0c;foreach控制器可以实现遍历参数&#xff0c;但是只能有一个入参。一旦遇到数组&#xff0c;foreach控制器表示我也无能为力。。。 为了解决这个问题&#xff0c;今天教大家一个实现数组…

JS 停留几秒后返回上一页

2019独角兽企业重金招聘Python工程师标准>>> <script type"text/javascript" language"javascript"> var i 5; intervalid setInterval("fun()", 1000); function fun(){if(i0){history.go(-1);clearInterval(intervalid);}i…

spring boot 分布式锁组件 spring-boot-klock-starter

基于redis的分布式锁spring-boot starter组件&#xff0c;使得项目拥有分布式锁能力变得异常简单&#xff0c;支持spring boot&#xff0c;和spirng mvc等spring相关项目 快速开始 spring boot项目接入 1.添加lock starter组件依赖&#xff0c;目前还没上传到公共仓库&#xff…