MySQL锁、数据库三范式

一、锁的概念

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 IndexesInstant DDLIn-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 操作期间只需更新受影响的元数据信息,而不是整个表。这样可以减少锁定时间和操作的开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值