MySQL5.6 RC innodb_log_compressed_pages 测试 及实现简述

MySQL5.6 RC增加了一个参数innodb_log_compressed_pages,以判定在压缩page时,是否在redo中存储压缩页数据。

最近把该特性在5.5.18上做了实现,从测试的效果来看,大大减少了redo log的写入量(降低到1/3~1/5),这会降低checkpoint的概率,并稍微增加了tps

以下数据,包括tps及每秒的log平均写入量(采集自status值Innodb_os_log_written)


innodb_log_compressed_pages

=0


innodb_log_compressed_pages

=1

Prepare data
 8333 rows/s   

 2.37MB/s


8130 rows/s

6.79MB/s

update_non_index.lua
1880.32 per sec 

3.26MB/s


1780.51 per sec

16.56MB/s

update_index.lua
1896.34 per sec

3.19MB/s


1824.21 per sec

16.93MB/s

oltp.lua
576.85 per sec

1.62MB/s


559.52 per sec

14.27MB/s

后续还需要做一些相关的crash恢复测试

////////////////////////////////////////////////////////////////

其他:innodb_log_compressed_pages主要修改细节

原本innodb记录每个压缩Page到redo中,目的是为了防止在崩溃恢复时,压缩的算法发生改变,尤其在引入了可调整的压缩级别(innodb_compression_level)后,如果重启后,使用不同的level,就可能无法恢复出一致的压缩页

mlog的背景知识可以参考这个:

http://www.mysqlops.com/2012/04/06/innodb-log2.html

目前对mini-transaction、redo以及崩溃恢复机制还不是特别了解,以下只是简述,并未深入。

1.btr_page_reorganize_low

@增加参数 compression_level

@在做page reorgnize之前,需要先写入一条mlog

之前是写入一条MLOG_COMP_PAGE_REORGANIZE或者MLOG_PAGE_REORGANIZE类型的mlog(mlog_open_and_write_index)

新的实现,增加了针对压缩表mlog类型MLOG_ZIP_PAGE_REORGANIZE,会写入压缩级别值。(在崩溃恢复时,也会调用到该函数,但mtr->log_mode为MTR_LOG_NONE,这时候不记录mlog)

例如,insert产生的调用栈为:

row_ins_index_entry->row_ins_index_entry_low->btr_cur_optimistic_insert->btr_page_reorganize->btr_page_reorganize_low

2.btr_cur_update_alloc_zip

这个函数用于检查压缩页中的mlog是否有足够的位置,如果没有,则需要重压缩,我们将page_zip_compress的mtr参数设置为NULL,就可以避免压缩页被写到redo中。

但我们需要写入一条redo log。记录压缩级别,因此引入了新的函数page_zip_compress_write_log_no_data以实现此功能,该函数会写入一条MLOG_ZIP_PAGE_COMPRESS_NO_DATA类型的redo log.

3.page_cur_insert_rec_zip_reorg

如果调用page_zip_compress压缩成功,并且关闭选项,则记录一条插入的redo log(page_cur_insert_rec_write_log,还没理清楚….),并调用page_zip_compress_write_log_no_data写入compress level.

4.为了实现崩溃恢复,recv_parse_or_apply_log_rec_body函数用于解析redo log中的记录并进行应用,有一大串的switch case,用以针对不同的mlog类型调用相应的函数

case MLOG_ZIP_PAGE_REORGANIZE:

–>和MLOG_PAGE_REORGANIZE以及MLOG_COMP_PAGE_REORGANIZE一样调用的是btr_parse_page_reorganize,btr_parse_page_reorganize会先从mlog中读取compress level,然后再调用btr_page_reorganize_low来重组织page

case MLOG_ZIP_PAGE_COMPRESS_NO_DATA:

–>增加新函数page_zip_parse_compress_no_data

读取redo log中记录的压缩级别,然后调用page_zip_compress做page压缩,这样可以保证崩溃前后压缩的数据是一样的。

时间: 2024-11-26 16:31:09

MySQL5.6 RC innodb_log_compressed_pages 测试 及实现简述的相关文章

[MySQL 新特性] MySQL5.6 RC的压缩表自适应padding实现

以下是对facebook的adaptive padding实现简述,实际上,这是个很小的补丁,并且对OLTP的性能提升效果非常显著(但会影响压缩的效果). 在5.6.7中引入了facebook对压缩表的改进,其中重要的特性之一就是adaptive padding. 我们知道,在buffer pool中,对一个压缩表的page,同时存在压缩页和非压缩页 –对Page的更改被记录到压缩page的mlog中 –当一个压缩页满时,会进行重压缩 –当重压缩失败时,会分裂压缩页 分裂压缩页的开销很大,需要对

我们的测试为什么不够敏捷?

测试是为了保证软件的质量,敏捷测试关键是保证可以持续.及时的对软件质量情况进行全面的反馈.由于在敏捷开发过程中每个迭代都会增加功能.修复缺陷或重构代码,所以在完成当前迭代新增特性测试工作的同时,还要通过回归测试来保证历史功能不受影响.为此我们期望: 测试范围足够广: ● 测试用例要覆盖所有功能: ● 要在各种可能的环境下作兼容性测试: ● 系统的稳定性.性能都要测试: 测试频率足够高: ● 每日构建产生的版本要保证可用: ● 每个迭代都需要对历史功能做回归测试: ● 释放前或上线后如果打了补丁,

远程测试的实施方法探讨及实践

一.现有测试实施方式中可能遇到的问题 在实际应用系统测试中,我们经常遇到一些系统部署范围较大的案例:比如某行业产品数据管理系统,其数据的采集工作由各地市级的生产单位执行,数据采集完毕后经由地市级分子公司汇总并上传到省局级分公司,在由省局级分公司上传至国家局总部进行最终的汇总和统计,以供领导进行整体规划和决策.由于其结构特点,可以将系统由上至下划分为总中心系统.省局系统.地市级系统和生产单位业务系统四部分(有时地市级系统和生产单位业务系统合并,即为总中心.省局.地市三部分),各部分由对应级别的业务

Linux安装Redis

1.下载源代码 http://code.google.com/p/redis/downloads/list 下载redis-1.2.6.tar.gz 将下载包拷贝到/usr/local/webserver/redis-1.2.6/下 或者http://redis.io/下载redis-2.4.15 2.安装 tar -zxvf redis-1.2.6.tar.gz   cd redis-1.2.6   make && make install 3.调整内存 如果内存情况比较紧张的话,需要设

利用LoadRunner编写socket性能测试脚本

一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socket概述 socket是操作系统中I/O系统的网络延伸部分,它扩展了操作系统的基本I/O到网络通信,使进程和机器之间的通信成为可能.如果想完全地理解socket在Loadrunner中如何工作的,熟悉一些关于它的历史会很有帮助. 当前常用的socket,最早起源于BSD UNIX类的操作系统.在UNIX系统上,比如BSD,把对网络的支持加入操作系统,以一

Windows7与其它Windows的双系统问题

安装Windows 7 RC与其它MicrosoftWindows组成双系统(当然有"主"有"副":为"副"者自然是Windows7RC).其中原因有二:1."RC"是至关重要的候选发行版本,系统功能已经基本定型(从RC版测试到正式版发布,主要是细微纠错使之臻于完善):2.有利于增强对新一代操作系统的熟悉.研究和掌握,可在正式版发布时实现平稳过渡. 第一,Windows7RC有32位(x86)和64位(x64)两种版本.我向大

存储过程 清理数据/删除表/重命名表

在做开发的过程中,会往数据库里写入很多测试的垃圾数据,到数据库需要正式发布的时候,这些测试数据必须清理掉.前面有同事用一条条delete 命令,组合成一个SQL文件去执行,很冗长,也很繁琐.于是思考能否做成一个通用的存储过程,只需要传入需要清理的数据库名称,然后自动清除所有的测试数 据呢?晚上找时间写了如下的存储过程,在MYSQL5.1.42版本测试通过. Sql代码   CREATE PROCEDURE Clear_Table_Data(       DB_NAME varchar(50) #

mysql事务处理用法与实例详解

一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行.换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的.如果在事务的任何操作失败,则整个事务将失败. 实际上,会俱乐部许多SQL查询到一个组中,将执行所有的人都一起作为事务的一部分. 事务的特性: 事务有以下四个标准属性的缩写ACID,通常被称为: 原子性: 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态. 一致性: 确保数据库正确地改变状态后,成功提交的事务. 隔离性:

mysql中IFNULL,IF,CASE的区别介绍_Mysql

假设有一数据表的状态字段设计为varchar类型,有以下值:NULL,pending,pending refund,refund,cancel. 我们知道查询状态为cancel的订单,SQL语句可以这样写:SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status = 'cancel' SQL语句能查询出正确的数据,但是当我们想查询状态为非cancel的订单时,可能会出麻烦,