Mysql的基础知识

基础知识

多版本并发控制MVCC

Mysql的InnoDB存储引擎是基于 多版本并开发控制协议实现的,MVCC的好处是 读不加锁,读写bu不冲突,读写不冲突大大提高了系统的并发能力。

MVCC是怎么提高并发能力

不再单纯的使用行级锁来进行数据库的并发控制,而是把数据行与多个版本进行结合起来,就可以实现非锁定读,也是乐观锁的一体现,从而提高数据库的并发能力。

MVCC的实现

MVCC是通过在每行记录的后面添加两个隐藏列来实现的,隐藏列分别保存的 创建时间行的删除时间,这里的时间实际上指的是自动递增的 系统版本号。在事务开启的时候,基于这个时点创建一份 快照,这样就可以保证与事务开始时刻一致的数据,在不同的事务里同一时刻看到同一行的数据有可能是不一样的,即数据行有多个版本。

快照读和当前读

在MVCC的并发操作中,读操作分为两种: 快照读当前读

快照读

读取可见版本的记录,不加锁

select * from a where ?

当前读

读取当前最新版本的记录,并且加上锁,保证不被其他事物修改这条记录。插入/更新/删除操作,属于当前读,需要加锁

select * from a where ? lock in share mode;

select * from a where ? for update;

insert into a values (…);

update a set ? where ?;

delete from a where ?;

在当前读时,为了保证数据不被其他事物修改,则对返回的记录加锁,锁有: 共享锁(S锁)排它锁(X锁),在上面的语句中,只有第一个查询属于 共享锁,其他的记录均为 排它锁

Update的执行过程

当mysql收到一个update语句时,mysql server解析出其中的where语句,并从InnoBD中读取第一条满足条件的记录,InnoDB引擎会将第一条记录返回,并加锁,待MysqlServer收到这个加锁的记录后,会在发起一个Update请求更新这个记录,一条记录被成功修改后会再读取下一个记录,直到满足条件的记录都被成功修改。

Mysql的基础知识

聚簇索引和辅助索引

在InnoBD中索引分为: 聚簇索引和非聚簇索引(辅助索引)

聚簇索引就是按照整个表的主键索引构建一个B+树,同时叶子节点中保存整个表中的行记录数据。

Mysql的基础知识

如果一个表没有主键索引,innodb会选择非空的唯一索引代替。如果没有非空的唯一索引,innodb会隐式的定义一个主键索引作为聚簇索引。

除聚簇索引之外的索引称为非聚簇索引,又叫辅助索引,辅助索引总是二次查找。辅助索引的叶子节点存储的是主键值。通过辅助索引找到主键值,再通过主键值找到数据行的数据页

Mysql的基础知识

事务隔离级别

数据库分为4个隔离记录,分别问: 读未提交(Read Uncommited)读已提交(Read Commited)可重复读(Repeatable Read)单序列(Serializable)

级别|描述
-|-|-
Read Uncommited|别的事务可以读取到当前事务没有提交的记录
RC (Read Commited)|快照读忽略;针对当前读,可以保证读取到别的事务已经提交的记录
RR (Repeatable Read)|快照读忽略;保证对读取到的记录加锁,并对读取范围加锁(间隙锁)
单序列(Serializable)|读写冲突,所有读为当前读,读加S锁,写加X锁

在RC的级别下,当插入一个记录前如果先查询一遍,发现没有,再做插入操作时,有可能会插入失败,插入失败后在查询一遍发现又有记录,这是因为插入操作为当前读,会读取数据库已经提交(RC级别下)的记录,发现最新的记录和即将插入的记录有主键或唯一索引冲突,则就插入失败。这种现象称为 幻读

在RR的级别下,如果是普通的查询、插入也会出现 幻读的现象,但是这种的幻读现象可以避免。

当隔离级别是可重复读,且禁用innodb_locks_unsafe_for_binlog的情况下,在搜索和扫描index的时候使用的next-key locks可以避免幻读。
InnoDB提供了next-key locks,但需要应用程序自己去加锁。

SELECT * FROM child WHERE id > 100 FOR UPDATE;

Original: https://www.cnblogs.com/hitechr/p/15129604.html
Author: Hitechr
Title: Mysql的基础知识

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590437/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球