---恢复内容开始---
索引是什么
索引是帮助MySql高效获取数据的排好序的数据结构
索引存储在文件里
索引结构
(二叉树、红黑树、BTREE、B+TREE、HASH)
二叉树
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。
二叉树存储方式:
以节点为基础,每新插入一个数据,则与父节点比较,若小于节点值则以节点为基础向左侧存储,反之向右,例如:
二叉树缺点:如果数据为有序递增,那么存入的数据结构为右侧连续,则该根节点只有右孩子,没有左子树,(称为斜树)从而失去二叉树本身的特性:
红黑树
红黑树针对二叉树的斜树做了一定优化,在二叉树的基础上,如果出现“斜树”的情况,则会自动均衡,均衡规则依旧按照二叉树特性(中间数值为节点,左侧子节点小,右侧子节点大):
红黑树的自动均衡,会使索引的存储结构更加优化,从而保证数据查询的效率
注意:如果数据库表中存储的数据量过大,会导致红黑树的高度过高(不断往下扩展子节点),恰好要查询的目标数据在树结构的最低端,同样会比较消耗查询性能,
可以发现:如果尽量降低树的高度,则会更大的提升查询效率,BTREE则针对此特点进行了优化
BTREE(B树)
从红黑树得知:每一个节点只会保存一个索引,而BTREE将每个节点的内存进行扩容,从而使每个节点可以保存更多的索引,从而降低树的高度,提升查询效率:
可以发现:相比红黑树,BTree的两层结构保存了更多的节点
BTree特点:
叶节点具有相同的深度
叶节点的指针为空
叶节点的数据key从左到右递增排列
如上图(右)可看到:BTree的每个节点会同时保存索引(key)和此索引对应的值(data)
so:如果可以减少每个索引的数据量,则减少每个索引的占用空间,从而在节点内存大小固定的情况下,每个节点可以保存更多的索引,会更进一步的降低树的高度(优化查询效率)
B+TREE(B+树)
B+Tree 相当于是BTree的变种,在BTree的基础上做了如下优化:
非叶子节点不存储data,只存储key,非叶子节点之间保存了指针,指向下一级,最终指向保存data的最底层叶子节点
叶子节点不存储指针
顺序访问指针,提高区间访问的性能(叶子节点的key从左到右依次递增,通过访问指针,如果遇到范围查询时可直接通过叶子节点的指针找到下一个索引,而不需要重新从根节点进行搜索)
Hash
hash与树结构毫无关系,数据库如果使用hash的数据结构,则会将索引通过hash算法生成一个hash值保存在表中,并与此索引对应的文件指针直接对应,查询效率会很高
但是大部分数据库的索引结构都用B+Tree,原因是hash结构只是在等号查询的时候效率很高,如果是其他查询(比如范围查询,则没有B+Tree如此高的效率)
---恢复内容结束---