mysql
innodb引擎下常用索引类型是B+树。B+树是一颗N叉树,是一颗矮胖的树,层高一般是1-3层,就能满足千万级别数据的存储,所以只需要经过3次IO,所以这就是B+树查询快的原因。
B+树 分 聚簇索引和普通索引
聚簇索引:一般都是以自增主键作为聚簇索引,聚簇索引的特点,在叶子节点中会保存每行中所有数据。而普通索引在叶子节点是保存的索引字段及主键。
思考:为什么要用自增主键做聚簇索引?
因为:自增主键是有序的,在维护索引的过程中,每次插入一条记录都是追加操作,不涉及挪动其他记录,不触发叶子节点的分裂。
加餐:
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。
InnoDB逻辑存储结构:表空间—》段——》区——》页
隔离级别:
分为读未提交、读已提交、可重复读、串行化。
mysql默认的隔离级别是可重复读,下面重点讲一下可重复读。事务T启动的时候会创建一个视图read-view,之后事务T执行期间,即使有其他事务修改了数据,事务T看到的仍然跟在启动时看到的一样。可重复读的核心就是一致性读。
一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:
1、版本未提交,不可见;
2、版本已提交,但是在视图创建后提交的,不可见;
3、版本已提交,而且是在视图创建前提交的,可见。
而事务更新数据的时候,只能用当前读。如果当前的记录的行锁被其他事务占用的话,就需要进入锁等待。更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读”。这里,我们提到一个概念,叫做当前读。其实除了update语句外,select语句如果加锁,也是当前读。当前读,总是读取已经提交完成的最新版本。
而读提交的逻辑和可重复读的逻辑类似,他们最主要的区别是:
在可重复读隔离级别下,只需要在事务开始的时候创建一致性视图,之后事务里的其他查询都共用这个一致性视图;
在读提交隔离级别下,每一个语句执行前都会重新算出一个新的视图。