[MySQL源码] Facebook对压缩表的改进

由于公司最近很多地方需要开始有使用压缩表的需求,但根据测试结果,压缩表对OLTP的性能相当不理想,在最近的一次测试中,UPDATE的性能最大可以下降到1/12,几乎不可接受。

 

Facebook从2011年开始对压缩表进行改进,花了两个星期从facebook的博客、facebook成员在官方list上提交的bug以及Mark在lauchpad上提交的patch着手调研,以下内容基本涵盖了Facebook对压缩表的改进,以及对应的Rev

接下来,需要做的就是研究这些Patch,如何为我所用。

 

注:除了以下内容,在查看facebook的bzr log时,还发现很多比较小的优化点(例如对innodb层线程调度的改进),但未公布出来,有兴趣的可以看看。

 

1.提供更多的信息来监控/诊断压缩表性能

MySQL本身(包括Percona版本)提供的压缩表内部信息非常少,很难通过这些信息来进行优化,Facebook增加了大量的信息用以显示。

从mysql@facebook的代码来看,为table_statistics增加了大量的统计数据,包括IO、索引、压缩表相关信息,我们关注如下几个跟压缩表相关的信息:

COMPRESSED_PAGE_SIZE COMPRESS_PADDING PADDING_SAVINGS COMPRESS_OPS 

COMPRESS_OPS_OK COMPRESS_PRIMARY_OPS COMPRESS_PRIMARY_OPS_OK

 COMPRESS_USECS COMPRESS_OK_USECS COMPRESS_PRIMARY_USECS 

COMPRESS_PRIMARY_OK_USECS UNCOMPRESS_OPS UNCOMPRESS_USECS

另外在update_global_table_stats函数中,facebook做了一些优化,通过原子操作代替锁操作,避免长期持有全局锁 LOCK_global_table_stats

相关:r3668r3670r3678

扩展innodb_cmp表的信息 r3679

更多的global status信息 r3672r3671

 

2.从redo log中移除压缩Page,并为压缩表增加了一种新的日志记录 –r3641

 

3.增加adpative padding功能,减少每个page上的数据来降低压缩失败率

类似于在page上填写空白,当压缩失败率升高到某个层次时,加大pad值。当失败率维持在很低的水平时,则减小pad值。

动态padding实现 r3754r3759r3764r3768

线性算法计算自适应padding值 r3820

4.减少分配的空白页,以降低文件的大小

相关bug: bug#64673

r3814

 

5.减少压缩Page的malloc/free次数

避免每次page 压缩/解压时频繁malloc/free 内存 r3808

 

6.更高效的压缩page checksum

对压缩page使用快速checksum r3824 related bug#49852

通过只在需要的时候计算压缩page/非压缩page的checksum来降低cpu占用 r3816 , r3817 related bug#64170

 

7.移除对adler32的调用 r3818

 

8.允许设置zlib的压缩级别

增加了新的参数innodb_compression_level来控制zlib的压缩级别 r3766

 

9. fix  bug#61341 r3675

 

10.其他

增加innochecksum工具对压缩表的支持 r3813

Fix bug#64258 可动态调整WAIT_FOR_READ r3792

跟压缩表相关,未具说明的bugfix r3779, r3780 (maybe related to bug#61208

 

时间: 2024-12-02 05:21:41

[MySQL源码] Facebook对压缩表的改进的相关文章

[MySQL源码] Facebook MySQL Rev3814 通过动态可调的FSEG_FILLFACTOR减少空闲Page

背景: –每个索引有两个segment,用于管理叶子节点和非叶子节点 –每个segment包含多个extend,extend是一次文件扩展单元(64个Page) –每个Page默认非压缩表为16K 相关Tips: SPACE HEADER :表空间的第一个Page中,用于管理所有下述结构, FILE SEGMENT INODE用于描述SEGMENT信息 每个EXTEND都对应一个EXTEND DESCRIPTOR,描述信息单独记录在一个Page中,占用40个字节,一个Page可以存放256个描述

MYSQL源码编译的变动

Mysql的安装,对于mysql不同版本的mysql源码编译方式不一样 5.6.2的版本开始编译方式已经由 configure 变成了cmake方式 ,相关的新的 编译方式在mysql官网已经提供 http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html 源码下载地址如下 http://dev.mysql.com/downloads/mysql/ 网上相关mysql5.6的源码编译方式 http://www.

MySQL源码:Range优化相关的数据结构

1. 背景知识 在开始介绍Range的主要数据结构之前,我们先看Range优化的一些概念和背景.依旧建议先阅读参考文件的[1-8],Sergey Petrunya写的PPT和文档质量都很高,很多图示,非常直观的展示了原理. (1) 什么是Range条件? 参考Range Optimization@MySQL Manual 单列Range和多列Range (2) 给定一个KEY(key1)对应的WHERE条件,如何将其转化成一个Range,下面是"简述",详细参考单列Range: SEL

Linux下MySQL源码编译安装(eg:mysql-5.6.27.tar.gz )

Linux下MySQL源码安装(eg:mysql-5.6.27.tar.gz ): 1:准备MySQL源码安装包: mysql-5.6.27.tar.gz.cmake-3.3.2.tar.gz.ncurses-6.0.tar.gz 注:centos请安装: yum install -y ncurses-devel yum install -y perl-Module-Install.noarch 网址: https://cmake.org/download/ ftp://invisible-is

MySQL源码:索引相关的数据结构(前篇)

1. MySQL如何描述某个数据表的索引 MySQL使用TABLE对象来描述一个数据表,那么数据表的索引是如何描述,索引的统计信息又是如何存储的呢? 例如我们有如下数据表: CREATE TABLE `users` ( `id` int(11) NOT NULL, `nick` varchar(32) DEFAULT NULL, `reg_date` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `IND_NICK` (`nick`), KEY `

Linux CentOS6.6系统中安装mysql源码包的方法_Linux

这里以CentOS6.6系统中安装MySQL的源码包,进行讲解. 1. mysql源码包的下载 mysql安装包的官方下载地址为:http://dev.mysql.com/downloads/mysql/5.6.html 打开该下载地址后,在 "Select Version:"处,选择要下载的mysql的版本,我选择的是5.6.34:在"Select Platform:"处,选择适用的操作系统类型,由于是下载源码包,故这里我们要选择Source Code. 之后,会

Linux下mysql源码安装笔记_Mysql

1.假设已经有mysql-5.5.10.tar.gz以及cmake-2.8.4.tar.gz两个源文件 (1)先安装cmake(mysql5.5以后是通过cmake来编译的) [root@ rhel5 local]#tar -zxv -f cmake-2.8.4.tar.gz [root@ rhel5 local]#cd cmake-2.8.4 [root@ rhel5 cmake-2.8.4]#./configure [root@ rhel5 cmake-2.8.4]#make [root@

mysql源码安装

我准备学下mysql的源码,所以编译和调试源码是很重要的一部分. 好了废话不多说. 我的环境是 CentOS-6.9-x86_64-minimal,这个可以在阿里的源中直接下.阿里云CentOS6.9下载地址 然后是安装之前的准备工作 先装好环境 yum update yum -y install cmake yum -y install bison yum -y install library* yum -y install libncurses5-dev yum -y install g++

MySQL 源码scr.rpm安装的一点注意事项

    rpm安装包通常为二进制包(Binary)以及源代码包(Source)两种形式.在使用源码方式安装MySQL的时候,官方网站上下载的源码包通常为scr.rpm格式,而不是直接的tar包,对此,需要先使用rpm命令先安装源码后在进行编译安装,本文是对该方式的描述.   1.下载源码包  http://mirrors.sohu.com/mysql/MySQL-5.6/  http://dev.mysql.com/downloads/mysql/   2.安装rpm#环境suse11:~ #