关于B-Tree有一系列有趣的性质,例如一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2),检索一个key,其查找节点个数的渐进复杂度为O(logdN)。大年夜这点可以看出,B-Tree是一个异常有效力的索引数据构造。
别的,因为插入删除新的数据记录会破坏B-Tree的性质,是以在插入删除时,须要对树进行一个决裂、归并、转移等操作以保持B-Tree性质,本文不计算完全评论辩论B-Tree这些内容,因为已经有很多材料具体说清楚明了B-Tree的数学性质及插入删除算法,有兴趣的同伙可以在本文末的参考文献一栏找到响应的材料进行浏览。
B+Tree
B-Tree有很多变种,个中最常见的是B+Tree,例如MySQL就广泛应用B+Tree实现其索引构造。
与B-Tree比拟,B+Tree有以下不合点:
情况四:萌芽前提没有指定索引第一列。
1. 每个节点的指针上限为2d而不是2d+1。
2. 内节点不存储data,只存储key;叶子节点不存储指针。
图3是一个简单的B+Tree示意。
图3
因为并不是所有节点都具有雷同的域,是以B+Tree中叶节点和内节点一般大年夜小不合。这点与B-Tree不合,固然B-Tree中不合节点存放的key和指针可能数量不一致,然则每个节点的域和上限是一致的,所以在实现中B-Tree往往对每个节点申请一致大年夜小的空间。
一般来说,B+Tree比B-Tree更合适实现外存储索引构造,具体原因与外存储器道理及计算机存取道理有关,将鄙人面评论辩论。
看起来是用了两个范围萌芽,但感化于emp_no上的“BETWEEN”实际上相当于“IN”,也就是说emp_no实际是多值精确匹配。可以看到这个萌芽用到了索引全部三个列。是以在MySQL中要谨慎地区分多值匹配和范围匹配,不然会对MySQL的行动产生困惑。
带有次序拜访指针的B+Tree
一般在数据库体系或文件体系中应用的B+Tree构造都在经典B+Tree的基本长进行了优化,增长了次序拜访指针。
上文评论辩论过InnoDB的索引实现,InnoDB应用集合索引,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。这就请求同一个叶子节点内(大年夜小为一个内存页或磁盘页)的各条数据记录按主键次序存放,是以每当有一条新的记录插入时,MySQL会根据其主键将其插入恰当的节点和地位,如不雅页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)。
图4
如图4所示,在B+Tree的每个叶子节点增长一个指向相邻叶子节点的指针,就形成了带有次序拜访指针的B+Tree。做这个优化的目标是为了进步区间拜访的机能,例如图4中如不雅要萌芽key为大年夜18到49的所稀有据记录,当找到18后,只需顺着节点和指针次序遍历就可以一次性拜访到所稀有据节点,极大年夜提到了区间萌芽效力。
这一节对B-Tree和B+Tree进行了一个简单的介绍,下一节结合存储器存取道理介绍为什么今朝B+Tree是数据库体系实现索引的首选数据构造。
为什么应用B-Tree(B+Tree)
一般来说,索引本身也很大年夜,弗成能全部存储在内存中,是以索引往往以索引文件的情势存储的磁盘上。如许的话,索引查找过程中就要产生磁盘I/O消费,相对于内存存取,I/O存取的消费要高几个数量级,所以评价一个数据构做作为索引的好坏最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的构造组织要尽量削减查找过程中磁盘I/O的存取次数。下面先介绍内存和磁盘存取道理,然后再结合这些道理分析B-/+Tree作为索引的效力。
主存存取道理
今朝计算机应用的主存根本都是随机读写存储器(RAM),现代RAM的构造和存取道理比较复杂,这里本文抛却具体差别,抽象出一个十分简单的存取模型来解释RAM的工作道理。
图5
显然这个萌芽等价于萌芽emp_no为10001的函数,然则因为萌芽前提是一个表达式,MySQL无法为其应用索引。看来MySQL还没有智能到主动优化常量表达式的程度,是以在写萌芽语句时尽量避免表达式涌如今萌芽中,而是先手工暗里代数运算,转换为无表达式的萌芽语句。
大年夜抽象角度看,主存是一系列的存储单位构成的矩阵,每个存储单位存储固定大年夜小的数据。每个存储单位有独一的地址,现代主存的编址规矩比较复杂,这老将其简化成一个二维地址:经由过程一个行地址和一个列地址可以独必定位到一个存储单位。图5展示了一个4 x 4的主存模型。
推荐阅读
【51CTO.com原创稿件】前不久,华为与石化盈科隆重推出了两边深度合作后首个重要>>>详细阅读
本文标题:MySQL:数据结构及算法原理
地址:http://www.17bianji.com/lsqh/35159.html
1/2 1