[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个描述符,因此每隔(256*64)个Page会有一个单独的EXTEND DESCRIPTOR PAGE

SEGMENT INODE 用于管理其对应的SEGMENT信息,其中记录了该SEGMENT拥有的EXTEND的相关信息(以及该SEGMENT内的碎片Page信息) ,一个Page内可以存储的SEGMENT INODE个数为FSP_SEG_INODES_PER_PAGE(zip_size)。SEGMENT INODE的位置信息可以由BTREE的根节点中的SEGMENT HEADER得到。

问题:

每个SEGMENT通过一个宏FSEG_FILLFACTOR来决定什么时候进行段扩展,默认为8,也就是说,当一个SEGMENT中保留的Page数少于1/8时,就要对其进行扩展一个EXTEND,也就是64个Page。这个值是硬编码的,Facebook将其修改成可动态调整的值,根据其测试,可以减少不少空闲Page(达到10%)

上述逻辑的判断是在函数fseg_alloc_free_page_low中实现,当然比描述的更加复杂(一堆if else :-(..)

把Patch backport到了5.5.18,并跑了下test case,两个相同结构的表,load相同的数据。

innodb_segment_reserve_factor = 8   ibd文件大小为20971520

innodb_segment_reserve_factor = 500, ibd文件大小为23068672

大约减小了9%

有兴趣的同学可以从mysqlatfacebook在lauchpad上的Rev3814 来获得diff

更主要的是从学习该patch的过程中,顺便了解了一下fsp相关知识。

 

时间: 2024-08-07 19:32:47

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

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

由于公司最近很多地方需要开始有使用压缩表的需求,但根据测试结果,压缩表对OLTP的性能相当不理想,在最近的一次测试中,UPDATE的性能最大可以下降到1/12,几乎不可接受.   Facebook从2011年开始对压缩表进行改进,花了两个星期从facebook的博客.facebook成员在官方list上提交的bug以及Mark在lauchpad上提交的patch着手调研,以下内容基本涵盖了Facebook对压缩表的改进,以及对应的Rev 接下来,需要做的就是研究这些Patch,如何为我所用.  

MySQL · 源码分析 · MySQL 半同步复制数据一致性分析

简介 MySQL Replication为MySQL用户提供了高可用性和可扩展性解决方案.本文介绍了MySQL Replication的主要发展历程,然后通过三个参数rpl_semi_sync_master_wait_point.sync_binlog.sync_relay_log的配置简要分析了MySQL半同步的数据一致性. MySQL Replication的发展 在2000年,MySQL 3.23.15版本引入了Replication.Replication作为一种准实时同步方式,得到广泛

MySQL · 源码分析 · MySQL BINLOG半同步复制数据安全性分析

半同步复制(semisynchronous replication)MySQL使用广泛的数据复制方案,相比于MySQL内置的异步复制它保证了数据的安 全,本文从主机在Server层提交事务开始一直到主机确认收到备机回复进行一步步解析,来看MySQL的半同步复制是怎么保证数 据安全的.本文基于MySQL 5.6源码,为了简化本文只分析DML的核心的事务处理过程,并假定事务只涉及innodb存储引擎. MySQL的事务提交流程 在MySQL中事务的提交Server层最后会调用函数ha_commit_

MySQL · 源码分析 · mysql认证阶段漫游

client发起一个连接请求, 到拿到server返回的ok包之间, 走三次握手, 交换了[不可告人]的验证信息, 这期间mysql如何完成校验工作? 过程(三次握手) 信息是如何加密的 client: hash_stage1 = sha1(password) hash_stage2 = sha1(hash_stage1) reply = sha1(scramble, hash_stage2) ^ hash_stage1 server: (逻辑位于sql/password.c:check_scr

mysql源码-关于mysql redo log的问题。

问题描述 关于mysql redo log的问题. http://bugs.mysql.com/bug.php?id=73202 上面是一个官方的patch, According to the crash recovery logic of mysql server, we only need to write/sync prepared transaction before writing to binlog. And currently transactions are not groupe

MySQL · 源码分析 · MySQL replication partial transaction

replication 概述 目前MySQL支持的replication方式多种多样 普通的master-slave 异步replication 半同步的semi-sync replication 支持多通道的group replication和double binlog 如果按连接协议来区分,又可以分为 非GTID模式,通过binlog文件名和文件的偏移来决定replication位点信息 GTID模式,通过GTID信息来决定replication位点信息 如果按apply binglog的方

CentOS 6.3下如何源码安装MySQL GA 5.6.10

在编译安装 MySQL 5.6.x 之前,需要最少安装的包有:bison,gcc.gcc-c++.cmake.ncurses-devel, 安装这些依赖包后,把原来解压出来的mysql源码目录删除掉,再重新解压出来,再去编译. -- 0 Download mysql-5.6.10.tar.gz in dev.mysql.com -- 1 安装cmake软件包 tar xzvf cmake-2.8.3.tar.gz ./bootstrap gmake gmake install -- 2 crea

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

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++