MySQL哪些常用DDL操作会锁表
问题我们后端开发人员在实现业务修改时,经常需要更新数据库表结构,如增加字段、修改字段长度等等。那么对于MySQL数据库,哪些表结构操作会“锁表”,会导致读写表中数据操作不能并发执行呢?背景知识DML( data manipulation language),数据操作语句,是中INSERT、UPDATE、DELETE、SELECT等表数据操作的语句。DDL( data definition lang
问题
我们后端开发人员在实现业务修改时,经常需要更新数据库表结构,如增加字段、修改字段长度等等。那么对于MySQL数据库,哪些表结构操作会“锁表”,会导致读写表中数据操作不能并发执行呢?
背景知识
DML( data manipulation language),数据操作语句,是指INSERT、UPDATE、DELETE、SELECT等表数据操作的语句。
DDL( data definition language ),数据定义语句,是指CREATE、ALTER、MODIFY、DROP等操作表结构相关的语句。
Online DDL,是MySQL5.6.7及以上版本支持的一种特性,可以实现表结构操作和读写表数据操作并发执行。之前的版本都不能并发执行。
MySQL中,表级别的锁有2种。一种是我们通常说的表锁,由InnoDB引擎实现,如lock tables … read/write,表锁影响较大,不常用。另一种表级别的锁是MDL( metadata lock ),由Server层实现,MDL我们不显式使用,是在访问一个表时由数据库自动加的,对表记录增删改查时,加MDL读锁;对表结构进行变更时,加MDL写锁。MDL锁,读读不互斥,读写、写写互斥。
哪些常用操作“锁表”
创建二级索引(二级索引是指除主键索引之外的索引)、删除索引、重命名索引、改变索引类型——不“锁表”。
添加字段、删除字段、重命名字段、调整字段顺序、设置字段默认值、删除字段默认值、修改auto-increment值、调整字段允许NULL、调整字段不允许NULL —— 不“锁表”。
扩展Varchar字段大小——不“锁表”。
更改字段数据类型,如varchar改成text——“锁表”
参考
不“锁表”的操作,实现性能和资源消耗也会存在不一样的,以及Online DDL 实现机制和最新发展可以参考如下内容
更多推荐
所有评论(0)