InnoDB的索引,锁,事务

索引

InnoDB索引就是分为聚簇索引和非聚簇索引,所有的非聚簇索引就是辅助索引。它们之间的最大区别就是,聚集索引中存放着一条行记录的全部信息,而辅助索引中只包含索引列和一个用于查找对应行记录的『书签』。下面面我们详细解释一下

聚簇索引

InnoDB 存储引擎中的表都是使用索引组织的,也就是按照键的顺序存放;聚集索引就是按照表中主键的顺序构建一颗 B+ 树,并在叶节点中存放表中的行记录数据
在这里插入图片描述
聚集索引与表的物理存储方式有着非常密切的关系,所有正常的表应该有且仅有一个聚集索引(绝大多数情况下都是主键),表中的所有行记录数据都是按照聚集索引的顺序存放的。

当我们使用聚集索引对表中的数据进行检索时,可以直接获得聚集索引所对应的整条行记录数据所在的页,不需要进行第二次操作。

辅助索引

一张表一定包含一个聚集索引构成的 B+ 树以及若干辅助索引的构成的 B+ 树。在这里插入图片描述
如果按照辅助索引查找一条记录,自己能按照辅助索引先查找出书签,再去聚簇索引中查找这一行的记录
,所以可能需要查找两次

InnoDB协议-MVCC(多版本的并发控制协议)

读不加锁,读写不冲突

读一般分为:快照读;当前读
快照读:记录的可见版本
当前读:记录的最新版本

快照度一般就是简单的select语句
当前读就是特殊的读操作,插入更新删除。

既然说到了锁,我们就简单介绍一下

我们都知道锁的种类一般分为乐观锁和悲观锁两种,InnoDB 存储引擎中使用的就是悲观锁,而按照锁的粒度划分,也可以分成行锁和表锁。我们都知道InnoDB实现的是行锁,乐观锁就是一种思想,并不是真正意义上的锁,我们这里不做过多的解释,主要以InnoDB为主。

锁的种类

在数据库中的操作也就是两种,读操作和写操作,而数据库实现锁时,因为主要是对这两种操作加锁,也就是共享锁和互斥锁(排他锁)
共享锁(读锁):允许事务对一条行数据进行读取;

互斥锁(写锁):允许事务对一条行数据进行删除或更新;
从名字上我们也能体会出来的就是,读是可以兼容的(共享),而写就是不兼容的(排他)

扫描二维码关注公众号,回复: 5560098 查看本文章

我们这里再简单介绍三种锁:
Record Lock:就是加到索引记录上的表,当使用辅助索引,不知道具体那条操作时,就需要对表加锁
Gap Lock:间隙锁,间隙锁是对索引记录中的一段连续区域的锁;当使用类似 SELECT*FROM users WHERE id BETWEEN10AND20FOR UPDATE;的 SQL 语句时,就会阻止其他事务向表中插入 id=15的记录,因为整个范围都被间隙锁锁定了。旨在默写事务的隔离级别中用到
Next-Key Lock:他是记录所和间隙锁的结合

事务和与隔离级别

介绍完锁之后,我们介绍一下事务,事务给代价最大的印象应该就是他的原子性,即操作失误,只要未提交,就可以rollback
事物遵循的ACID四大原则:原子性,一致性,隔离性,持久性

四种隔离级别(层次从低到高)

Read Uncommit 读未提交 存在脏读,不可重复度,幻读的问题
用户可以读取未提交的记录,也就是脏读
Read Commit 读提交 存在不可重复度,幻读的问题
针对当前读,保证对读取到的记录加锁
Repeatable Read 可重复度InnoDB默认的一开始是存在幻读问题的,后来通过使用(MVCC和GAP)改善了
保证对读取到的记录加锁,同时波保证对读取的范围加锁,新的满足查询条件的记录,不能插入(GAP)
**Serializable ** 从MVCC并发控制退化成基于锁的并发控制,读写冲突,读+读锁,写+写锁

下一篇我们就通过一个例子来分析一下InnoDb的加锁过程

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/88415718