[MySQL 特性] MySQL5.6.7 对压缩表的改进

5.6.7已经RC,其中关于压缩表部分,引进了大多数Facebook的改进

1.可配置的zlib压缩级别 innodb_compression_level

用于动态调整zlib的压缩级别,从1-9,默认为6,越小压缩效果越差,但压缩速度越快;值越大,压缩效果越好,可能会减小压缩失败及page split, 但速度越慢,有更多的CPU开销。

2. innodb_log_compressed_pages

控制压缩page是否被记录到redo中,这会减少redo产生的数据量,可能会提升throughput

3.增加adaptive padding功能,通过在page中留下空白来防止减少page分裂,Facebook的实现是在启动mysqld后,对压缩表中的压缩失败的page进行采样,以计算出合适的留白数。

增加了两个参数:

innodb_compression_failure_threshold_pct  当压缩失败rate大于这个值时,会增加padding来减小失败率,为0表示禁止该padding.(官方文档貌似有误,已report)

 innodb_compression_pad_pct_max 一个page中最大允许留白的百分比

4.新的关于压缩表的i_s表:

 innodb_cmp_per_index

innodb_cmp_per_index_reset

由于这些表里记载了每个索引的压缩信息,因此会产生一些额外的开销,通过选项 innodb_cmp_per_index_enabled 来控制开关

例如:

mysql> select * from  innodb_cmp_per_index\G

*************************** 1. row ***************************

  database_name: cmp2k8

     table_name: com1@@@

     index_name: PRIMARY

   compress_ops: 34999

compress_ops_ok: 34150

  compress_time: 13

 uncompress_ops: 424

uncompress_time: 0

1 row in set (0.00 sec)

innodb_cmp_per_index_reset跟 innodb_cmp_per_index差不多,区别就是每次查询时会重置之前的统计。

简单的load数据来看,效果还是很明显的,

5.6.6—1622 rows/s

5.6.7—6500 rows/s

接下来,开始将这些改进backport到我们的线上版本5.5.18中

时间: 2024-09-17 11:30:25

[MySQL 特性] MySQL5.6.7 对压缩表的改进的相关文章

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

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

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

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

[MySQL 源码] MySQL drop table(压缩表)效率与流程分析

 之前发生过一起连续drop压缩表,最后长时间等待信号量crash,线上alert log里的报错是: OS WAIT ARRAY INFO: reservation count 36647199, signal count 34050225 --Thread 1331538240 has waited at row0purge.c line 680 for 950.00 seconds the semaphore: S-lock on RW-latch at 0xe60b60 '&dict_o

[MySQL学习] MySQL压缩表

以下是在阅读官方文档时的笔记 官方文档: http://dev.mysql.com/doc/refman/5.6/en/innodb-compression.html#innodb-compression-tuning //////////////////////////////////////////////////////////////////////// 关于压缩表,可以调整的参数看起来只有key_block_size,在建表时指定,意味着innodb会将page压缩到指定的大小,例如,

MySQL数据库中已压缩表特征

已压缩存储格式是由myisampack工具创建的只读格式. 所有MySQL分发版里都默认包括myisampack.已压缩表可以用myisamchk来解压缩. 已压缩表有下列特征: · 已压缩表占据非常小的磁盘空间.这最小化了磁盘用量,当使用缓慢的磁盘(如CD-ROM)之时,这是很有用的. · 每个记录是被单独压缩的,所以只有非常小的访问开支.依据表中最大的记录,一个记录的头在每个表中占据1到3个字节.每个列被不同地压缩.通常每个列有一个不同的Huffman树.一些压缩类型如下: o 后缀空间压缩

[MySQL学习]Innodb压缩表之内存分配/回收

最近看到Yoshinori Matsunobu在官方buglist上提交的一个Bug#68077,大意是说,当使用压缩表时,在bp吃紧时,存在过度碎片合并的情况.Innodb压缩表由于存在不同的Page Size,因此使用buddy allocator的方式进行内存分配,他的内存块来自于buffer pool中. 如bug#68077所提到的,如果我们使用的全部是4kb的内存块,那么把他们合并成8k的又有什么意义呢?并且在碎片整理的过程中,函数buf_buddy_free 的效率是很低的.在之前

【MySQL】MySQL5.6新特性之Batched Key Access

一 介绍  MySQL 5.6版本提供了很多性能优化的特性,其中之一是关于提高表join性能的算法 --- Batched Key Access (BKA) ,本文将结合之前写过MRR,BNL优化特性一起来详细介绍该算法.这篇文章是 我拖延时间最久的,之前一直没有搞清楚MRR,BKA之间的关联 ,BKA,BNL的区别,本周花了一天时间收集资料,算是搞懂了,里面有基于文档翻译的,可能不准确,请大家指正.二 原理   对于多表join语句,当MySQL使用索引访问第二个join表的时候,使用一个jo

MYSQL使用心得(四) 临时表与内存表

mysql5.5性能优化-内存表 内存表分为2种,但共同点是,重起数据库以后,内存中的数据全部丢失,内存表的功能 有部分的限制,有些属性不能像正常表一样使用,所以请大家使用的时候谨慎参照官方文档.下面只是抛砖引玉. 1.临 时表:表建在内存里,数据在内存里 2.内存表:表建在磁盘里,数据在内存里 其中包括2个重要的参数 [mysqld] # 内存表容量 max_heap_table_size=1024M # 临时表容量 tmp_table_size=1024M 建立内存表的时候,在5.5里,需要

mysql使用MRG_MyISAM(MERGE)实现水平分表

在MySql中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基本的优化信息,也可以让你在自己的程序开发中受益匪浅.当然数据库的优化有很多的方方面面,本篇主要讲,Mysql的水平分表技术,也可以说是其技术的其中之一. 在使用水平分表时,首先问下自己几个问题. 第一.为什么要水平分表? 第二.什么时候需要水平分表? 第三.怎样实现水平分表? 一.为什么要水平分表? 简而言之,当单表数据量过大时,无法对其进行有效的维护,以及查询速度严重