一、锁的概念
1.1 锁的分类
锁分类如下图所示:
从对数据操作类型分类:
读锁(共享锁) : 针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排它锁) : 当前写操作没有完成前,它会阻断其他写锁和读锁。
共享锁又称读锁,表示在读取数据时不允许其他事务对数据进行修改(只能进行共享或普通查询)。
SQL语句:select .... lock in share mode; (使用共享锁后,另一个客户端不能使用排他查询)
排它锁又称独占锁。在一个事务操作时,其他事务不允许操作数据(包括查询)。
SQL:select .... for update;
从对数据操作粒度分类:表锁、行锁
表锁也是是InnoDB存储引擎中的一种锁机制,用于控制对表的并发访问。InnoDB表锁包括共享锁(Shared Lock)和排他锁(Exclusive Lock),用于实现不同程度的并发读写操作。严格意义上来说,InnoDB存储引擎没有MyISAM存储引擎那种直接的完整的表级锁。
1.2 InnoDB表锁的特点和使用方式
1.InnoDB表锁是自动隐式锁定的,不需要手动指定。
2.InnoDB存储引擎默认采用行级锁(Row-Level Locking)而不是表级锁。这意味着在InnoDB中,锁定的粒度更细,可以同时支持并发读写操作,减少了锁冲突和阻塞的可能性。
3.InnoDB采用多版本并发控制(MVCC)机制,读取操作不会阻塞写入操作,写入操作也不会阻塞读取操作,提高了并发性能。
4.InnoDB表锁在事务中使用,并且锁的持有时间尽可能短,以减少阻塞和冲突的可能性。
5.InnoDB表锁的具体行为受到事务的隔离级别和锁定模式的影响。通过设置合适的隔离级别和锁定模式,可以平衡并发性能和数据一致性的要求。
1.3数据库三范式
概念: 三范式就是设计数据库的规则, 是符合某一种设计要求的总结
1) 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据 库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式
2) 满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的 称为第二范式(2NF),其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)
1.3.1第一范式
概念: 原子性, 做到列不可拆分
第一范式是最基本的范式。数据库表里面字段都是单一属性的,不可再分, 如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式。
1.3.2第二范式
概念:
1) 在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关
2) 一张表只能描述一件事
1.3.3第三范式
概念:
消除传递依赖
表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放
二、给数据表增加一列,一定会锁表吗?
在 MySQL 中,使用 InnoDB 存储引擎给数据表增加一列时,并不一定会锁表。InnoDB 存储引擎提供了一些机制来减少对表的锁定,以提高并发性能。
2.1 MySQL 5.6 会不会锁表
从 MySQL 5.6 版本开始,InnoDB 引擎引入了在线数据定义语言(DDL)操作,其中包括对表结构的修改。这些在线 DDL 操作允许在不锁定整个表的情况下进行结构更改。具体来说,以下是可能的情况:
对于增加非空列: 在 InnoDB 中,增加非空列时,会执行一个快速的元数据操作,不会锁定整个表。这意味着在修改期间,其他会话可以继续读取和写入表数据。
对于增加可为空列: 在 InnoDB 中,增加可为空列时,也会执行一个快速的元数据操作,不会锁定整个表。其他会话可以继续读取和写入表数据,但在修改期间,可能会有一些短暂的行锁定。
注意:尽管 InnoDB 存储引擎提供了较少的锁定,但在执行 ALTER TABLE 语句时仍可能会有一些性能影响。这可能是由于内部的元数据操作、数据重组或日志写入等引起的。
2.2 MySQL 8.0 会不会锁表
MySQL 8.0 在处理大数据表增加字段的情况下进行了一些优化,进一步优化了减少对表的锁定时间和降低性能影响。在MySQL8.0中,还引入了Invisible Indexes
、Instant DDL
和In-Place Alter
升级等新功能,可以进一步提高MySQL的性能和可维护性。
原子 DDL: MySQL 8.0 引入了原子 DDL(Atomic DDL)操作,这意味着 ALTER TABLE 语句的执行过程中将会有更少的阻塞。在增加字段的情况下,原子 DDL 机制可以减少对表的锁定时间,并允许其他会话继续读取和写入数据。
立即更新元数据: MySQL 8.0 在增加字段时立即更新表的元数据,而不需要等待整个操作完成。这样可以更快地完成 ALTER TABLE 操作,并减少对表的锁定时间。
InnoDB 引擎优化: MySQL 8.0 的 InnoDB 存储引擎针对大数据表的结构修改进行了一些优化。例如,对于增加非空字段,InnoDB 不再需要复制整个表的数据。相反,它会使用一种更轻量级的操作来添加新字段,从而减少锁定时间和资源消耗。
增量元数据更新: MySQL 8.0 引入了增量元数据更新,这意味着在 ALTER TABLE 操作期间只需更新受影响的元数据信息,而不是整个表。这样可以减少锁定时间和操作的开销。