1、B树和B+树
都是一种平衡的多路查找树B树非叶子和叶子节点都是存储数据+索引,每一个节点都是一个页,每一页的存储空间有限**(16kb)**,页里面相当于有多个节点。B+树的非叶子节点只是存储索引,叶子节点才会存储数据。B+树和B树相比,会更加的矮宽。
B+树高度较低,并且每一页由于不用存储数据信息,可以存较多的索引信息,加大了每页存储节点的数量,减少磁盘IO
- 具体的讲解可以看下图:
这个是聚簇索引的B+树,绿色的0代表这个页中的节点是存储数据的节点,2表示是这个页的开始节点【记录了上一个页的地址,方便链表连接相邻页】,3表示是结束节点【记录了下一个页的地址,方便链表连接相邻页】,1表示是非叶子节点
黄色的序列表示的是这个需要记录的表中实际索引,从根节点开始,他相邻的两个节点都是“一段索引的最开始”,相当于如果我想找表中索引1-320之间的数据,我就需要去下一层的页30去找,同此思路,继续向下查找,直到叶子节点。
下面这个是非聚簇索引的B+树。需要再这个的基础上再去原本的主键索引B+树去查找
2、索引
B+树中主要有两种,也可以说索引主要有两类:聚簇索引、非聚簇索引
聚簇索引的叶子节点存储了整个数据行,而非只是索引键值,并且是按照主键,也就是索引值排序
非聚簇索引的叶子节点存储了索引键值和指向对应数据行的指针。包括普通索引、唯一索引等。是按照选取哪一个列当作索引值进行排序的
比如非聚簇索引中,我如果是用表中的字段name当作索引【他会按照name这个字段的大小进行存储】,那么看B+树的第二个图,蓝色就是name的值,而下面的黄色一行便指向的是这个name值对应的数据行是在表中的第几行
默认是主键当作索引,且创建的是聚簇索引。如果没有创建主键,InnoDB会自动创建rowid辅助进行创建了聚簇索引
而且聚簇索引和非聚簇索引其实是可以共同存在于一张表中的
3、MyISAM和InnoDB区别
1、讨论这两种存储引擎的区别
主要是记住MyISAM不支持外键和事务,锁也是只有表锁,没有行锁
他支持的少所以如果只是读操作会比较高效,但是如果有修改等操作还是需要InnoDB
2、讨论这两个引擎使用的索引区别(***重点说这个)
MyISAM使用的是非聚簇索引,主键索引B+树和辅助索引B+树的叶子节点都保存了一个地址,指向真正的表数据,并不真正的存储数据。叶子节点并不实际存储数据。
InnoDB是聚簇索引,默认是主键,主键索引B+树的叶子节点存储的是行数据,辅助索引B+树的叶子节点存储的是索引值和主键值(也就是指向行数据的指针),通过这个主键值二次查找,去主键索引B+树种找对应的行数据
4、索引结构
说的B+树,Hash表,红黑树都算是MySQL的索引结构
不用红黑树是因为:红黑树的出度都是2,节点很多的时候,红黑树的高度会比B+树高很多,IO次数会很多,查询变慢。不过红黑树比普通的平衡二叉树好在,旋转至少两次就能平衡,较少资源占用
不用hash表是因为,hash表需要将内存全部加载到内存,占用内存较大,而采用B+树的话可以分批加载到内存。并且hash结构的索引是无序的,会比较慢,而B+树是有序的
用内存较大,而采用B+树的话可以分批加载到内存。并且hash结构的索引是无序的,会比较慢,而B+树是有序的