索引和事务

本文详细介绍了MySQL中的索引类型,包括B-树、B+树、聚簇索引与非聚簇索引的区别,以及它们在数据存储和查询效率上的影响。此外,还阐述了事务的基本概念,如ACID特性、事务隔离级别及其可能导致的问题,如脏读、不可重复读和幻读。重点讨论了InnoDB存储引擎下的索引和事务管理。
摘要由CSDN通过智能技术生成

目录

什么是索引

MySQL中最经典的两种存储引擎

为什么需要索引

索引的CURD

创建索引

删除索引

查看索引

 索引的存储位置

键与索引

​编辑 

 索引背后的数据结构

B-树

 B-树的特点

聚簇索引

保存信息特点

特点

非聚簇索引

保存信息特点

特点

聚簇索引与非聚簇索引的关联

B+树

特点:

RBTree与HashMap的弃用原因

 RBTree

 计算机的运行流程

​编辑

 HashMap

事务

什么是事务

回滚

事务的ACID(原子性,持久性,隔离性,一致性)特性

原子性:事务中最核心的操作

持久性:

一致性:

隔离性:

事务的四种隔离级别

1.读未提交

2.读已提交

3.可重复读

4.串行化

事务间的各种问题

脏读

不可重复读

幻读


什么是索引

关于索引 会常问如下几个问题 :

简单说索引就可以理解成数组的索引,为了方便查找而设计出来的,通过索引就可以拿到数组中的数据,用索引去查找数据库中的数据是速度很快的。

MySQL中最经典的两种存储引擎

MyISAM: MySQL5.5之前的默认存储引擎,不支持事务,性能较高

InnoDB: MySQL5.5之后的默认存储引擎,支持事务,性能相对MyISAM较差

本章讲的所有关于索引和事务的实现都是基于InnoDB引擎

为什么需要索引

索引最适用于数据量较大,并且查多改少的情况

索引会提高查询数据的效率,但是会拖慢增删改的效率

创建索引也需要时间和空间的开销

索引和数据表的关系 就像 目录和书本内容的关系,但从目录中查找内容时要比一页一页地翻快得多,但是如果修改书本内容,也需要改目录。

索引的CURD

创建索引

 这样,如果当一个属性数据量很大时,若存在他的索引,查找速度会非常快

创建索引前:

 创建索引后:

删除索引

drop index 索引名 on 表名;

查看索引

show index from 表名;

 

 索引的存储位置

键与索引

主键约束,外键约束,唯一约束都是对应的索引

 

 索引背后的数据结构

MySQL的索引实现基于B+树的设计(N叉搜索树)

首先我们来了解一下B-树

B-树

B树都是严格的平衡树,左右子树的高度差为0,左树和右树的高度完全相等

 B-树的特点

1.每个树节点有多个值

2.每个节点上子树的个数是当前树的节点值个数 + 1

3.子树中的节点值一定在父节点的范围之内

聚簇索引

又称主键索引,一个表只有一个主键索引。

保存信息特点

构建聚簇索引树的每个节点,不仅会保存索引列的信息,还会保存这条记录的完整内容。

特点

聚簇索引的查询速度快,每个表中只有一个,但是保存的信息多,占用的空间也大。

非聚簇索引

又称二级索引

普通索引,唯一索引

例如index创建的,都是非聚簇索引,一张表可以有多个非聚簇索引

保存信息特点

索引树上的每个节点保存的是创建的对应属性索引的列信息,以及其行号(对应的主键id)

特点

非聚簇索引的查讯速度慢,因为它只能找到主键id,然后回表查询

但是它保存的信息少,占用的空间小,并且一张表可以有多个

聚簇索引与非聚簇索引的关联

首先,在非聚簇索引中找到 对应属性值的索引,该索引保存主键id的信息,然后回到聚簇索引树,用主键id找到对用的完整信息

 

B+树

特点:

1.子节点中存在的最大值(最小值)是在父节点出现过的值,这样在最底层的叶子节点就可以包含整个数据的全集

2.B+树中,最底层的叶子节点使用链表连接,这样可以进行更高效的区间查找,例如查找[5,13]区间的数据

3.对于B+树来说,所有的数据都在叶子节点,非叶子节点只需要保存索引列的辅助信息(索引列的值)即可,非叶子节点的占用空间小,因此可以直接放在内存中,减少磁盘IO

RBTree与HashMap的弃用原因

 RBTree

 计算机的运行流程

 HashMap

无法处理范围操作

 

事务

关于事务,会常问如下问题:

事物的四种隔离级别以及相应的问题

脏读 不可重复读 幻读

什么是事务

将若干个SQL语句打包为一个整体,在开始事务后,实际执行只在关闭事务的那一刻才认定执行,也就是说,事务这个整体要么全部执行,要么全部不执行。

回滚

在执行的过程中如果发生突发情况导致一些操作无法执行,MySQL可以保证突发情况恢复之后,数据不遭到破坏。

 

通过事务的"回滚" roll back 操作进行数据的还原 

MySQL的binlog文件记录了所有表数据的修改动作,可以作为回滚的依据。

事务的ACID(原子性,持久性,隔离性,一致性)特性

原子性:事务中最核心的操作

一个事务中的所有操作,要么全部执行成功,要么全部执行失败。(执行失败后,通过rollback回滚数据)。

持久性:

一个事务执行完成之后,这个事务对数据库的所有修改都永久有效(持久化,保存在磁盘),不会丢失。

一致性:

一个事务执行前后的数据都是一种合法化的状态,事务永远都是从一个一致性到另一个一致性的状态。

隔离性:

多个并发事务访问数据库时,事物之间应该是相互隔离的,一个事务不应该被其他事务干扰,不同事务之间相互隔离。

并发性指:事务间不一定同时进行,有可能这个事务执行到一半,又去执行另一个了。

事务的四种隔离级别

1.读未提交

该隔离级别的事务可以看到其他还没提交事务对数据库的修改 ——  RU

2.读已提交

该隔离级别的事务可以看到其他已提交事务对数据库的修改 ——  RC - Oracle数据库默认的隔离级别

3.可重复读

InnoDb默认的隔离界别,在此隔离级别下,事务提交之前看到的多次结果都是相同的,其他事务无论怎样修改数据库在此事务中均不可见。

在可重复读的事务中,第一次查询到的视图会在后边一直被使用,会引发幻读问题

4.串行化

最高隔离级别,事务在同一时间段只开启一个,不会发生冲突,也不会产生问题,不是并发执行。

事务间的各种问题

脏读

事务A修改数据之后,事务B读到了事务A修改的数据,然后事务A发生了回滚,这个时候事务B读到的数据就是脏数据。

不可重复读

同一事务多次相同查询后有一次查询的结果不同

幻读

查询不到记录,但无法进行插入

例如下图的可重复读情况:

 各种隔离级别分别存在的问题:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值