树
树是一个大于等于1个有限节点组成的具有层次关系的集合,树上的节点要满足三个条件
有并且只有一个节点没有父节点的这个节点称为根
除了根节点,其他节点都有一个父节点
树中的每个节点都构成以它为根的树
二叉查找树BST(Binary Search Tree)
二叉查找树是一种查找结构
具有三个性质
左子树不空,所有左子树节点值小于根节点值
右子树不空,所有右子树节点值大于根节点值
左右子树本身有分别是一棵二叉查找树
中序遍历会得到一个递增序列所以又叫二叉排序树最大特点(左根右)
查找:o(log2n)
平衡二叉树AVL
在二叉查找树的基础上多了一个要求,任意节点的左右树高度差不超过1
高度差的计算是左子树-右子树的高度
平衡因子为 -1,0,1
插入和删除会调整最小不平衡树
平衡二叉树相对于二叉查找树来说,效率更加稳定。
B树
二叉查找树和平衡二叉树随着数据越多,树的深度就越深,意味着io次数越多, 影响读取的效率
B树又叫多路平衡查找树
b树中所有节点的孩子节点数的最大值称为b树的阶
每个节点之多有m个孩子节点(即之多有m-1个关键字)
降低了深度查找数据的时候读取磁盘的次数就减少了。降低io操作,效率也就提升了
存储单元称之为页(页其实就是磁盘的每个磁盘块)
B+树
B+树就是B树的一个升级
b树和b+树的区别:
b树每个节点都存储了key和数据,而b+树只在叶子节点存储数据,其他数据只能存储key。
b树的叶子节点他们之间是没有关系的,而b+树的叶子节点是相互之间有一个引用链路的想链表一样
B+树所有的数据都存储在叶子节点上并且是按照顺序排列的。那么使用B+树完成范围查找,排序查找,分组查找,去重查找就会很简单,效率也比较高。而B树就不可以。因为B树的数据是分散个各个节点上的。
聚集索引和非聚集索引
聚集索引(聚簇索引):如果数据库使用InnoDB存储引擎,那么表中的数据一定会有一个主键,如果用户不创建主键系统也会帮你创建一个隐式的主键。
之所以一定要有主键因为InnoDB把数据放在B+树上,而B+树上的key就是主键。如果以主键构建的B+树索引那么就称之为聚集索引。
聚集索引:物理排序数据行,支持范围查询和顺序访问,一个表只能有一个。
核心思想
根节点是常驻内存的,所有不需要进行IO操作
根据各节点找到对应的p,根据p的指针找到对应的下一级页。最终达到叶子节点。通过二分查找法定位到数据位置,通过单向链表或者当前页的数据,再通过双向链表获取下一页的数据,最终获取所有需要查询的数据。
非聚集索引:根据索引键值查找数据行,支持快速定位,一个表可以有多个。
核心思想
定位为查询的数据以后只能得到索引对应的主键,那么需要根据主键进行回表查询(拿着主键去聚集索引中获取数据)。
非聚集索引:以主键以外的列作为key构建B+树索引就称之为非聚集索引
使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。