MySQL 5.7.6: wl#5757 InnoDB支持大page

worklog:

http://dev.mysql.com/worklog/task/?id=5757

官方mysql 在git上代码比较零散,具体的实现我们可以参考webscalesql上的代码:https://reviews.facebook.net/D31107

或者在webscalesql的git上: git show ebd27a35db6ef2267efd69da392e5efdc77611a6

我们知道Innodb的默认page size为16KB。在MySQL5.6版本里我们可以将page size调整到16kb以下,例如4kb或者8kb(参考wl#5756)。从5.7.6开始支持更大的page size设置。

为什么需要大page:

对于写入型负载:

1. 如果写入列包含大的字符串或者大字段,就可以有更多的机会将长字段留在页面内,而不是外部存储。

2. 由于page变大,容纳的记录变多,因此可以减少索引分裂的次数。

3. 更大的page意味着可以获得更好的压缩性,因此未来可以基于大页来做Page compress

缺点:

1.对于IO-BOUND场景下的读为主的负载,大page size并不是合适的选择,例如我们将innodb_page_size设置为64Kb, 如果读取是随机读,意味着最差情况下,如果想获取一条只有几十字节的数据,都要读取一整块64kb的数据。

2.由于buffer pool是以page size来划分块的,因此更大的page size也意味着更少的buffer pool block,可能更容易产生page flush /evict

3.另外,当page size设为32kb时,一个extend size为2MB,为64kb时,extend size为4KB. 而小于等于16kb时,为1M,这意味着当ibd文件扩展时,一次可能扩展更多的size。另外innodb对extend会做一定比例的page保留,因此当extend size越大,可能浪费更多的空间

关于extend的介绍,可以参考官方博客的这篇文章:http://mysqlserverteam.com/extent-descriptor-page-of-innodb/

4.当产生外部存储页时,显然会浪费更多的存储空间

当前的限制:

1.只有在初始安装时设置innodb_page_size,一旦实例安装完成,就不可以改变了,换句话说,innodb_page_size要和ibdata的page size相同。

2.目前不支持大页面压缩 (硬伤,估计未来会支持)

当前压缩表的page内,对于dense directory,会预留14字节来标示记录业内位置,因此解压页被限制到16kb,要实现大页面压缩,需要解除这个限制。

时间: 2024-09-20 08:12:19

MySQL 5.7.6: wl#5757 InnoDB支持大page的相关文章

MySQL 5.7.6 WL#7868 Innodb page flush优化

在上期的我们的月报(2015/2)中,我们已经针对Oracle MySQL以及社区版本最新的对innodb page flush的优化做了详细的介绍. 在最近release的5.7.6版本中又有了进一步的改进.     修改一.更精确的loop计算时间     Page cleaner会每做srv_flushing_avg_loops次后,会去计算刷脏和redo lsn增长的速度.由于每次Page cleaner的工作量是自适应的,一次flush操作的时间可能超过1秒,因此做N次loop的总时间

Mysql 之 添加innodb支持

在对mysql进行编译安装时,当安装完成后有时会发现不支持innodb存储引擎,这是因为编译安装时缺少支持innodb的参数: --with-plugins=PLUGIN[,PLUGIN..] Plugins to include in mysqld. (default is: none) Must be a configuration name or a comma separated list of plugins. Available configurations are: none ma

MySQL从MyISAM引擎转换到InnoDB引擎需要注意的地方

  分析 当了解完两种引擎的不同之处,很轻松的就能知道有哪些关键点了. 总的来说,从MyISAM转向InnoDB的注意事项有: 1.MyISAM的主键索引中,可以在非第一列(非第一个字段)使用自增列,而InnoDB的主键索引中包含自增列时,必须在最前面;这个特性在discuz论坛中,被设计用于"抢楼"功能,因此,若有类似的业务,则无法将该表从MyISAM转成InnoDB,需要自行变通实现(我们则是将其改到Redis中实现); 2.不带条件频繁统计全表总记录数时(SELECT COUNT

MySQL存储引擎中MyISAM和InnoDB区别详解_Mysql

InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能. 以下是一些细节和具体实现的差别: ◆1.InnoDB不支持FULLTEXT类型的索引. ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select coun

Mysql 的存储引擎,myisam和innodb的区别_Mysql

简单的表达.  MyISAM 是非事务的存储引擎.  innodb是支持事务的存储引擎.    innodb的引擎比较适合于插入和更新操作比较多的应用  而MyISAM 则适合用于频繁查询的应用    MyISAM --表锁.  innodb--设计合理的话是行锁.  MyISAM 不会出现死锁.    最大的区别就是MYISAM适合小数据,小并发:INNODB 适合大数据,大并发.最大的区别就是在锁的级别上.    MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持. MyISA

mysql建表unknown storage engine innodb

问题描述 mysql建表unknown storage engine innodb 建表的时候出现的问题,网上百度了一下给出的方法都没有解决. 解决方案

MySQL数据库MyISAM存储引擎转为Innodb的方法_Mysql

mysql数据库存储引擎为MyISAM的时候,在大访问量的情况下数据表有可能会出现被锁的情况,这就会导致用户连接网站时超时而返回502,此时就需要MySQL数据库MyISAM存储引擎转为Innodb.步骤如下: 1.导出CentOS数据库的表结构 复制代码 代码如下: mysqldump -d -uxxx -p centos > centos_table.sql 其中-d参数表示不导出数据,只导出表结构 2.替换centos_table.sql里的MyISAM为INNODB 复制代码 代码如下:

Java实现Dbhelper支持大数据增删改_java

在做项目的时候,技术选型很重要,在底层的方法直接影响了我们对大数据访问以及修改的速度,在Java中有很多优秀的ORM框架,比如说:JPA,Hibernate 等等,正如我们所说的,框架有框架的好处,当然也存在一些可以改进的地方,这个时候,就需要我们针对于不同的业务不同的需求,不同的访问量,对底层的架构重新封装,来支持大数据增删改. 代码: import java.io.*; import java.sql.*; import java.util.*; import java.util.loggi

flash-FLASH支持大几百张位图图片和两个场景的交互会卡吗?

问题描述 FLASH支持大几百张位图图片和两个场景的交互会卡吗? FLASH支持大几百张位图图片和两个场景的交互会卡吗?如果会卡,那我想只用一个场景实现下列效果:这个场景中有一个影片剪辑元件1存于一帧中,不是首帧.该影片剪辑元件1内部嵌套有影片剪辑元件2,影片剪辑元件2内有许多关键帧.我可以为影片剪辑元件内部每一帧均添加一个相同按钮,想通过点击这个按钮画面就会跳转到影片剪辑元件1的首帧,这个按钮应该添加什么代码? 解决方案 没有必要一次性装载所有的图片,而是只装载当前视图中可以看到的图片,这样可