谈到索引,大家并不陌生。索引本身是一种数据结构,存在的目的主要是为了缩短数据检索的时间,最大程度减少磁盘 IO。
任何有数据的场景几乎都有索引,比如手机通讯录、文件系统(ext4\xfs\ntfs)、数据库系统(MySQL\Oracle)。数据库系统和文件系统一般都采用 B+ 树来存储索引信息,B+ 树兼顾写和读的性能,最极端时检索复杂度为 O(logN),其中 N 指的是节点数量,logN 表示对磁盘 IO 扫描的总次数。
MySQL 支持的索引结构有四种:B+ 树,R 树,HASH,FULLTEXT。
B 树是一种多叉的 AVL 树。B-Tree 减少了 AVL 数的高度,增加了每个节点的 KEY 数量。
B 树的特性:(m 为阶数:结点的孩子个数最大值)
1. 树中每个节点最多含有 m 个孩子节点 (m>=2);
2. 除根节点和叶子结点外,其他节点的孩子数量 >=ceil(m / 2);
3. 若根节点不是叶子结点,最少有两个孩子
特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点;
4. 每个非叶子结点中包含有 n 个关键字信息:(n,P0,K1,P1,K2,P2,......,Kn,Pn) 其中:
Ki (i=1...n) 为关键字,且关键字按顺序升序排序 K(i-1)<Ki
Pi 为指向儿子节点的指针,且指针 P(i-1) 指向的儿子节点里所有关键字均小于 Ki,但都大于 K(i-1)
关键字的个数 n 必须满足:[ceil(m / 2)-1]<= n <= m-1
如果一个结点有 n 个关键字,那么该结点有 n+1 个分支。这 n+1 个关键字按照递增顺序排列
所有叶子结点都出现在同一层,是所有遍历的终点位置
B+ 树是一种树数据结构,是一个n叉树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,
也可能是一个包含两个或两个以上孩子节点的节点。
B+ 树通常用于数据库和 *** 作系统的文件系统中。
NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。
B+ 树的特点是能够保持数据稳定有序,
其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入。
数据库使用的B树,而不是B+树。使用B树的目的是为更有效的组织数据库表里的数据如何存储,按什么方式来存储,可以有利于后期对表里的数据的检索,可以快速给定关键字定位某条数据存放在哪个区,哪一页。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)