问题

我们后端开发人员在实现业务修改时,经常需要更新数据库表结构,如增加字段、修改字段长度等等。那么对于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 实现机制和最新发展可以参考如下内容

5.7版本Online DDL Operations

淘宝 白话Online DDL

MySQL InnoDB Online DDL学习

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐