MySQL Innodb DDL 概览.md

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sun_ashe/article/details/82746978

简介

本文从DDL在Innodb内部执行方式的不同上,来分类简介Innodb DDL操作,而关于inplace方式的ddl内部执行逻辑,另开一篇进行介绍。


分类

我们向来习惯以DDL是否锁表来对DDL进行分类,比如说当前使用比较广泛的MysQL-5.7版本,Innodb表添加索引,添加字段是不锁表的,而某些更改字段类型的操作是锁表的。下面来通过Innodb执行方式的不同来进行分类。

  • short cut
  • inplace no rebuild
  • inplace rebuild
  • copy table

从上到下,这四种不通的ddl方式会对应不同的内部执行逻辑,从时间上来看,short cut所用使用最少,因为他不需要对真正存储的数据作出更改,其余的依次递增。


short cut

在这之前,可能在DDL相关的术语中没有听说过这个词汇,但它一直都存在,我也是在阅读调试DDL相关的代码时才发现的。这种类型的DDL操作极快,并且不需要修改数据页,所以被命名为short cut。那么,都有哪些Innodb表的DDL操作属于short 操作呢,可以先看下代码中是如何定义的

/** Operations for altering a table that InnoDB does not care about */
static const Alter_inplace_info::HA_ALTER_FLAGS INNOBASE_INPLACE_IGNORE
	= Alter_inplace_info::ALTER_COLUMN_DEFAULT
	| Alter_inplace_info::ALTER_COLUMN_COLUMN_FORMAT
	| Alter_inplace_info::ALTER_COLUMN_STORAGE_TYPE
	| Alter_inplace_info::ALTER_VIRTUAL_GCOL_EXPR
	| Alter_inplace_info::ALTER_RENAME;

从代码注视中可以了解到,这些操作是Innodb不关心的,也就是其并不更改Innodb存储的信息。MySQL习惯以比特位来表示这些信息。从代码可以看出,short cut类型的ddl包括更改字段默认值,更改字段的行格式,更改存列的存储类型,以及rename操作。

inplace no rebuild

mysql从5.5开始支持inplace的DDL操作方式,极大的提高了DDL的执行速度,这种方式避免了copy table,也就是逻辑的一行一行的拷贝数据。no rebuild意味着不需要额外至少一倍的存储空间。比如添加索引操作,只需要将新添加的索引页写入到原来的表空间即可。

inplace rebuild

inplace rebuild是inplace ddl操作的另外一种方式,虽然rebuild不需要copy table,但是依然需要额外一倍的存储空间来存放临时数据,并且需要进行表的切换操作。

copy table

copy table是最原始的DDL操作方式,其执行速度最慢,并且不可以动态操作,需要一行一行的读取原来表空间中的数据,然后写入到临时表中,最后进行表的rename操作。

总结

线上在执行DDL操作时,如果不确定是否锁表,必须加上lock=none,如果不支持在线添加,sql会报错处理。

猜你喜欢

转载自blog.csdn.net/sun_ashe/article/details/82746978