首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 基础架构:一条SQL查询语句是如何执行的?
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
07 | 行锁功过:怎么减少行锁对性能的影响?
08 | 事务到底是隔离的还是不隔离的?
09 | 普通索引和唯一索引,应该怎么选择?
10 | MySQL为什么有时候会选错索引?
11 | 怎么给字符串字段加索引?
12 | 为什么我的MySQL会“抖”一下?
13 | 为什么表数据删掉一半,表文件大小不变?
14 | count(*)这么慢,我该怎么办?
15 | 答疑文章(一):日志和索引相关问题
16 | “order by”是怎么工作的?
17 | 如何正确地显示随机消息?
18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?
19 | 为什么我只查一行的语句,也执行这么慢?
20 | 幻读是什么,幻读有什么问题?
21 | 为什么我只改一行的语句,锁这么多?
22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
23 | MySQL是怎么保证数据不丢的?
24 | MySQL是怎么保证主备一致的?
25 | MySQL是怎么保证高可用的?
26 | 备库为什么会延迟好几个小时?
27 | 主库出问题了,从库怎么办?
28 | 读写分离有哪些坑?
29 | 如何判断一个数据库是不是出问题了?
30 | 答疑文章(二):用动态的观点看加锁
31 | 误删数据后除了跑路,还能怎么办?
32 | 为什么还有kill不掉的语句?
33 | 我查这么多数据,会不会把数据库内存打爆?
34 | 到底可不可以使用join?
35 | join语句怎么优化?
36 | 为什么临时表可以重名?
37 | 什么时候会使用内部临时表?
38 | 都说InnoDB好,那还要不要使用Memory引擎?
39 | 自增主键为什么不是连续的?
40 | insert语句的锁为什么这么多?
41 | 怎么最快地复制一张表?
42 | grant之后要跟着flush privileges吗?
43 | 要不要使用分区表?
44 | 答疑文章(三):说一说这些好问题
45 | 自增id用完怎么办?
当前位置:
首页>>
技术小册>>
MySQL 实战 45 讲
小册名称:MySQL 实战 45 讲
### 06 | 全局锁和表锁:给表加个字段怎么有这么多阻碍? 在数据库管理系统中,尤其是在使用MySQL这样的关系型数据库时,对表结构的修改往往不仅仅是简单的增加、删除或修改字段那么简单。这些操作背后涉及到复杂的锁机制,包括全局锁和表锁,它们直接影响了数据库的并发性能和数据的完整性。本章将深入探讨全局锁和表锁的概念,以及它们如何影响给表添加字段这类看似简单的操作,进而揭示背后隐藏的复杂性和潜在的性能瓶颈。 #### 一、全局锁:系统级别的封锁 ##### 1.1 全局锁的概念 全局锁,顾名思义,是对整个数据库实例加锁的一种机制。当数据库执行某些特定操作时,如全局备份、全库迁移等,需要确保在操作过程中,数据库的数据不会发生任何改变,此时就会使用到全局锁。全局锁一旦加上,整个数据库将处于只读状态,任何尝试修改数据的操作都会被阻塞,直到锁被释放。 ##### 1.2 全局锁的影响 - **性能瓶颈**:全局锁期间,数据库无法接受任何写操作,这在大规模并发场景下会极大地影响业务性能。 - **风险增加**:长时间的锁定可能导致系统无法响应其他紧急操作,增加了系统风险。 - **操作复杂性**:使用全局锁进行维护操作时,需要仔细规划时间窗口,确保对业务影响最小。 ##### 1.3 实际应用中的挑战 给表加字段时,虽然看似不涉及全局锁,但在某些情况下,如使用`mysqldump`等工具进行全库备份时,如果备份过程中有表结构变更(如加字段),则可能因备份工具内部实现而间接触发全局锁,进而影响备份和正常业务的进行。 #### 二、表锁:表级别的封锁 ##### 2.1 表锁的概念 表锁是对数据库中单个表进行加锁的机制。当对表进行某些特定操作时,如`ALTER TABLE`、`DROP TABLE`等,MySQL会自动对表加锁,以确保操作的原子性和一致性。表锁分为共享锁(读锁)和排他锁(写锁),前者允许多个事务同时读取表,但不允许写操作;后者则禁止其他任何读写操作。 ##### 2.2 表锁的影响 - **并发限制**:表锁会限制对表的并发访问,特别是在高并发场景下,可能会导致大量查询和更新被阻塞。 - **锁粒度大**:相比于行锁或页锁,表锁的粒度更大,锁冲突的可能性也更高。 - **性能下降**:长时间的表锁可能导致数据库整体性能下降,尤其是当被锁表是业务核心表时。 ##### 2.3 给表加字段的阻碍 给表加字段通常通过`ALTER TABLE`语句实现,这一操作会触发表锁。在MySQL 5.5及之前的版本中,`ALTER TABLE`几乎总是导致全表扫描并重建表,这个过程中表会被锁定,无法进行任何读写操作。即使在MySQL 5.6及以后的版本中,通过在线DDL(Data Definition Language)优化,部分`ALTER TABLE`操作可以在不锁表的情况下完成,但添加或删除列等操作仍然需要重建表,导致长时间的锁表时间。 #### 三、给表加字段的挑战与解决方案 ##### 3.1 挑战分析 1. **长时间锁表**:如前所述,`ALTER TABLE`可能导致的长时间锁表是最大的挑战,直接影响业务连续性。 2. **资源消耗**:表重建过程中需要消耗大量CPU、IO等资源,可能导致系统整体性能下降。 3. **风险性**:在生产环境中直接进行表结构变更存在数据丢失或损坏的风险。 ##### 3.2 解决方案 1. **选择合适的时机**:在低峰时段进行表结构变更,减少对业务的影响。 2. **使用pt-online-schema-change工具**:Percona提供的`pt-online-schema-change`工具可以在不锁表的情况下,通过创建影子表、复制数据、切换表名等方式,实现表结构的在线变更。 3. **分批修改**:对于大型表,可以考虑将修改操作分批进行,每次处理表的一部分数据,以减少对系统的影响。 4. **使用Ghost工具**:GitHub的Ghost工具是另一种实现在线DDL的工具,它采用类似`pt-online-schema-change`的原理,但可能提供更多的定制选项和更好的性能。 5. **考虑使用其他数据模型**:如果表结构变更频繁且影响大,可能需要重新评估数据模型,考虑使用更适合频繁变更的模型,如NoSQL数据库。 #### 四、总结 给表加字段这一看似简单的操作,在实际操作中可能因全局锁和表锁的影响而变得复杂。了解并掌握这些锁机制的工作原理及其影响,对于数据库管理员和开发人员来说至关重要。通过选择合适的时机、利用在线DDL工具、优化数据模型等手段,可以有效减轻表结构变更对数据库性能的影响,确保业务的平稳运行。同时,随着数据库技术的不断发展,新的解决方案和工具不断涌现,持续关注并学习这些新技术,将有助于我们更好地应对未来的挑战。
上一篇:
05 | 深入浅出索引(下)
下一篇:
07 | 行锁功过:怎么减少行锁对性能的影响?
该分类下的相关小册推荐:
MySQL从入门到精通(二)
MySQL从入门到精通(三)
MySQL8.0入门与实践
细说MySQL(零基础到高级应用)
SQL零基础到熟练应用(增删改查)
MySQL从入门到精通(一)
MySQL必会核心问题
MySQL从入门到精通(四)
MySQL从入门到精通(五)