MySQL 5.7

InnoDB 存储引擎系列文章

以下是我发布在我们团队的(Aliyun RDS MySQL 开发组)每月内核月报上关于InnoDB的几篇文章,不断更新中….. 如下是传送门: MySQL · 引擎特性 · InnoDB undo log 漫游 MySQL · 引擎特性 · InnoDB redo log漫游 MySQL · 引擎特性 · InnoDB 崩溃恢复过程 MySQL · 引擎特性 · Innodb change buffer介绍 MySQL · 引擎特性 · InnoDB Adaptive hash index介绍 MySQL · 引擎特性 · InnoDB 全文索引简介 MySQL · 引擎特性 · InnoDB 事务子系统介绍 MySQL · […]


InnoDB foreign key 实现

本文是对Innodb外键实现代码路径的简单记录,对外键实现逻辑熟悉的同学直接忽略吧。。。。。 前言 外键代表两张表之间的引用约束关系:在子表上出现的列记录,必须在父表上已经存在。通过外键,我们可以确保业务上的逻辑一致性,同时还能实现一些级联操作;MySQL目前只有InnoDB引擎支持外键,类似MyISAM、Tokudb等引擎都不支持外键。 InnoDB支持建立多个列的外键,但被外键约束的父表上必须对这些列建立索引,并且子表上的外键列 和父表上索引上的顺序是一致的。默认情况下,当删除父表中被外键约束的记录时,会产生报错,但我们也可以通过在建外键索引时加上ON DELETE CASCADE 来级联的更新子表,更新同理。其他行为包括RESTRICT(限制父表的外键改动,默认值)、CASCADE(跟随父表的改动)、SET NULL(子表对应列设置为NULL)、SET DEFAULT(设置为默认值,InnoDB不支持,但Server层支持)、NO ACTION(无动作)。 原创文章,转载请注明: 转载自Simple Life 本文链接地址: InnoDB foreign key 实现 Post Footer automatically generated by wp-posturl plugin for wordpress.


InnoDB IO子系统介绍

本文我们来简单过一下InnoDB的IO子系统相关模块的代码逻辑。主要包括IO读写线程、预读逻辑、InnoDB读写Page以及社区的一些改进。 前言 InnoDB对page的磁盘操作分为读操作和写操作。   对于读操作,在将数据读入磁盘前,总是为其先预先分配好一个block,然后再去磁盘读取一个新的page,在使用这个page之前,还需要检查是否有change buffer项,并根据change buffer,进行数据变更。   读操作分为两种场景:普通的读page及预读操作,前者为同步读,后者为异步读   Page写操作也分为两种,一种是batch write,一种是single page write。写page默认受double write buffer保护,因此对double write buffer的写磁盘为同步写,而对数据文件的写入为异步写。   同步读写操作通常由用户线程来完成,而异步读写操作则需要后台线程的协同。 原创文章,转载请注明: 转载自Simple Life 本文链接地址: InnoDB IO子系统介绍 Post Footer automatically generated by wp-posturl plugin for wordpress.


MySQL 5.7 BUGFIX BUG#12161

(本文已发布到我们的内核月报中,请点击链接访问更多精彩:http://mysql.taobao.org/monthly/2015/04/这里只是在本博客里做个备份 ) 在MySQL 5.7版本里,大量遗留很多年的bug都被fix掉了,bug#12161就是其中一个,该bug在2005年第一次report到Bug list上,十年之后终于在MySQL 5.7.7 第一个RC版本被fix了。 Bug描述 当我们显式开启一个XA事务,执行操作,并完成XA PREPARE后,如果Kill session或者主动断开,再重连执行XA RECOVER,之前的这个XA事务是丢失了的。 原创文章,转载请注明: 转载自Simple Life 本文链接地址: MySQL 5.7 BUGFIX BUG#12161 Post Footer automatically generated by wp-posturl plugin for wordpress.


[MySQL 5.7.7] 拆分LOCK_grant读写锁

Worklog: https://dev.mysql.com/worklog/task/?id=8355 问题: Lock_grant锁实际上是一个读写锁,每执行一条sql都要读取执行check_grant来检查权限是否匹配,这时候加的是读锁,而读锁是可以并发的。大多数情况下加锁开销是很不明显的,但是在MySQL将大多数只读场景下的锁都消除掉后,LOCK_grant开始变的比较突出了。 5.7里主要消除掉了几种会影响到只读性能的锁: #为InnoDB表消除THR_LOCK #MDL LOCK维护改成LOCK FREE的算法 #为AUTO-COMMIT的SELECT缓存Read View来减少trx_sys->mutex冲突 Stewart Smith report了一个Bug#72829 来描述LOCK_grant在power机型的影响,在他的测试中,LOCK_grant去除掉后,居然有50的性能提升。我相信这是和平台相关的。。。因为我的机器上很难达到这样的提升。。。。 原创文章,转载请注明: 转载自Simple Life 本文链接地址: [MySQL 5.7.7] 拆分LOCK_grant读写锁 Post Footer automatically generated by wp-posturl plugin for wordpress.


[MySQL 5.7.6] Generated Column

updated @2015-08-09, mysql-5.7.8-rc对generated column的改进:   InnoDB: InnoDB now supports secondary indexes on virtual generated columns. For more information, seeCREATE TABLE and Generated Columns. InnoDB: Virtual generated column values no longer occupy space in database rows. With this change, a table rebuild is no longer required when adding or dropping virtual generated columns. Virtual generated columns […]


[MySQL5.7.6]InnoDB native partition table

Worlog链接:http://dev.mysql.com/worklog/task/?id=6035 相关worklog: http://dev.mysql.com/worklog/task/?id=4305 官方博客介绍:http://mysqlserverteam.com/innodb-native-partitioning-early-access/ 在之前的版本中,分区表的分区管理模式是放在server层,对于底层引擎层而言并不存在分区表的概念,每个分区和普通的表,对InnoDB引擎而言都是等同等低位的。由于需要为每个分区建立handler,这种方式可能导致过多的资源浪费,例如bug#62536 和 bug#37252。 原创文章,转载请注明: 转载自Simple Life 本文链接地址: [MySQL5.7.6]InnoDB native partition table Post Footer automatically generated by wp-posturl plugin for wordpress.


[MySQL5.7.6] 新的tablespace类型–general tablespace

从5.7.6开始,增加了一种新的 tablespace模式(成为general tablespace),实际上它和共享表空间比较类似:创建一个单独的ibd,ibd中包含多个表,兼容不同的格式。general tablespace没有库的概念,因此可以在多个库里建属于同一tablespace的表。   为了支持这TABLESPACE,主要做了两部分改动:Innodb层的支持,及Server层对MDL子模块的改动。 原创文章,转载请注明: 转载自Simple Life 本文链接地址: [MySQL5.7.6] 新的tablespace类型–general tablespace Post Footer automatically generated by wp-posturl plugin for wordpress.


MySQL5.7.6: 通过序列区间来优化并行复制性能

Worklog: http://dev.mysql.com/worklog/task/?id=7165   我们知道,在MySQL5.7.2中增加了一种新的并行模式:为同时进入COMMIT阶段的事务分配相同的序列号,这些拥有相同序列号的事务在备库是可以并发执行的。   具体如何实现参阅我之前的一篇博客:http://mysqllover.com/?p=810   在之前的实现中,序列号是在binlog prepare阶段赋值,在engine commit(group commit的第三个阶段)之前递增,因此主库在GROUP COMMIT阶段的并发越高,在备库能够并发执行的事务越多。这个序列号被写入binlog中,备库根据序列号决定哪些事务可以并发执行。 原创文章,转载请注明: 转载自Simple Life 本文链接地址: MySQL5.7.6: 通过序列区间来优化并行复制性能 Post Footer automatically generated by wp-posturl plugin for wordpress.


MySQL 5.7.6: 如何不停服务开启复制拓扑内的GTID

相关worklog: http://dev.mysql.com/worklog/task/?id=7083    (强烈建议阅读) http://dev.mysql.com/worklog/task/?id=7592 Gtid作为5.6版本以来的杀手级特性,却因为不支持拓扑结构内开关而饱受诟病。如果你需要从未开启GTID的环境升级到开启GTID,需要把这个复制结构里的实例shutdown后,再重启。相信这对于任何24小时服务的互联网应用都是不可接受的。 原创文章,转载请注明: 转载自Simple Life 本文链接地址: MySQL 5.7.6: 如何不停服务开启复制拓扑内的GTID Post Footer automatically generated by wp-posturl plugin for wordpress.