mysql添加字段多少数据量会锁表_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...

概述

表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

MySQL 中表级锁有两种:一种是表锁,另一种是元数据锁(meta data lock, MDL)。

表锁

表锁的语法是 lock tables...read/write。与 FTWRL 类似,可以使用 unlock tables 主动释放锁,或者在客户端断开链接时自动释放。

在还没有出现更细粒度的锁之前,表锁是最常用于处理并发的。而对 InnoDB 这种支持行锁的引擎,一般不使用 lock tables 命令来控制并发。

MDL

另一类表级的锁是MDL。MDL不需要显式使用,在访问一个表的时候会被自动加上。

在MySQL 5.5版本中引入MDL,当对一个表做 CURD 时,加 MDL 读锁;当要对表做 DDL 时,加 MDL 写锁;

读锁之间不互斥。

读写锁之间、写锁之间互斥。

有时候给一个小表加个字段,可能会导致整个库挂掉。假设表 t 是一个小表。

3dc0ac91e6e61756d3f54eb25ffa6fe7.png

图1 给表 t 加字段

会话A加了 MDL 读锁;会话B也加了 MDL 读锁,可以正常执行;会话C被阻塞,等待会议A释放 MDL 读锁。

如果只是会话C被阻塞倒没关系,但之后所有在表 t 上新申请MDL 读锁都会被会议C阻塞。也就是这个表现在完全不能读写了。

如何安全地给小表加字段?

很简单,在 ALTER TABLE 加等待时间。如果超过等待时间后,操作回滚。

MariaDB 已经合并了 AliSQL 的这个功能,所以这两个开源分支目前都支持 DDL NOWAIT/WAIT n 这个语法。

ALTER TABLE tbl_name NOWAIT add column ...

ALTER TABLE tbl_name WAIT N add column ...

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当需要在大数据量MySQL表中添加字段时,一般采取以下步骤: 1. 首先,确认新字段数据类型和长度。需要考虑新字段所存储的数据类型和取值范围,选择合适的数据类型,以及确定字段的长度,以确保数据的准确性和完整性。 2. 在确认新字段数据类型和长度后,可以使用ALTER TABLE语句来添加字段。ALTER TABLE语句用于修改表的结构,包括添加字段、删除字段、修改字段等。语法如下: `ALTER TABLE 表名 ADD 列名 数据类型 [约束件] [FIRST | AFTER 上一个字段];` 其中,表名为要进行修改的表名称,列名为新字段的名称,数据类型为新字段数据类型,约束件为字段的约束件,如NOT NULL,UNIQUE等。FIRST和AFTER用于确定新字段的位置,可以是第一个字段或者在某个已有字段后进行插入。 3. 执行ALTER TABLE语句后,MySQL将执行表的结构变更操作,添加字段到表中。在表数据量较大的情况下,这个过程可能需要一定时间,取决于服务器的性能和数据量的大小。 4. 在添加字段后,需要考虑对该字段进行相应的操作,如插入默认值、更新现有数据等。可以使用UPDATE语句批量更新现有数据,以确保新字段数据和已存在的数据保持一致。 需要注意的是,在进行表结构变更操作时,建议先备份数据,以避免意外情况造成数据丢失或损坏。另外,在大数据量表上进行结构变更操作时,建议在低峰期进行,以减少对系统性能的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值