目录
什么是索引
关于索引 会常问如下几个问题 :
简单说索引就可以理解成数组的索引,为了方便查找而设计出来的,通过索引就可以拿到数组中的数据,用索引去查找数据库中的数据是速度很快的。
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读到的数据就是脏数据。
不可重复读
同一事务多次相同查询后有一次查询的结果不同
幻读
查询不到记录,但无法进行插入
例如下图的可重复读情况:
各种隔离级别分别存在的问题: