关键字就是key的意思

一、B-Tree的性质

1、定义任意非叶子结点最多只有M个儿子,且M>2;

2、根结点的儿子数为[2, M];

3、除根结点以外的非叶子结点的儿子数为[M/2, M];

4、每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

5、非叶子结点的关键字个数=指向儿子的指针个数-1;

6、非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

7、非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

8、所有叶子结点位于同一层;

二、B+Tree

B+树的性质(下面提到的都是和B树不相同的性质)

1、非叶子节点的子树指针与关键字个数相同;

2、非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1]]的子树.(B树是开区间,也就是说B树不允许关键字重复,B+树允许重复);

3、为所有叶子节点增加一个链指针;

4、所有关键字都在叶子节点出现(稠密索引). (且链表中的关键字恰好是有序的);

5、非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层;

6、更适合于文件系统;

三、为什么说B+树比B树更适合数据库索引

1、 B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

3、由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

四、提升效率

B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

查找数据,最简单的方式是顺序查找。但是对于几十万上百万,甚至上亿的数据库查询就很慢了。

所以要对查找的方式进行优化,熟悉的二分查找,二叉树可以把速度提升到O(log(n,2)),查询的瓶颈在于树的深度,最坏的情况要查找到二叉树的最深层,由于,每查找深一层,就要访问更深一层的索引文件。在多达数G的索引文件中,这将是很大的开销。所以,尽量把数据结构设计的更为‘矮胖’一点就可以减少访问的层数。在众多的解决方案中,B-/B+树很好的适合。B-树定义具体可以查阅,简而言之就是中间节点可以多余两个子节点,而且中间的元素可以是一个域。相比B-树,B+树的父节点也必须存在于子节点中,是其中最大或者最小元素,B+树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。这就使以页为单位的索引中可以存放更多的节点。减少更多的I/O支出。因此,B+树成为了数据库比较优秀的数据结构,MySQL中MyIsAM和InnoDB都是采用的B+树结构。不同的是前者是非聚集索引,后者主键是聚集索引,所谓聚集索引是物理地址连续存放的索引,在取区间的时候,查找速度非常快,但同样的,插入的速度也会受到影响而降低。聚集索引的物理位置使用链表来进行存储。

mysql为什么用B 树做索引_mysql为什么用b+树做索引相关推荐

  1. mysql explain 索引_MySql中Explain详解与索引最佳实践

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...

  2. mysql新增BTREE索引_mysql如何添加多个btree索引

    目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构. 1.B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度值不超过1,而且同层级的节点间有指针相互链接 2.在B+树 ...

  3. mysql 重复率高字段 索引_MySQL性能优化(二)索引优化

    一.选择合适的列建立索引 1.在where从句,group by从句,order by从句,on从句中出现的列(select) 2.索引字段越小越好(表每页数据才会更多,IO效率会更高) 3.离散度大 ...

  4. mysql字段简索引_MySQL常用的一些语句,索引,字段等

    1.库相关: 建库: character set:指定编码 COLLATE:排序规则 utf8mb4_general_ci 大小写不敏感 CREATE DATABASE `test_db` defau ...

  5. mysql创建联合索引_mysql如何创建多个联合索引

    mysql创建多个联合索引的方法:可以使用CREATE INDEX或ALTER TABLE语句来创建.在创建联合索引时,应该仔细考虑列的顺序. MySQL中索引规则: 1.需要加索引的字段,要在whe ...

  6. mysql in 命中索引_MySql优化-你的SQL命中索引了吗

    在项目开发中SQL是必不可少的,表索也一样.这些SQL的运行性能不知道吗?有多少是命中了索引的?命中哪个索引?索引中有哪个是无效索引?这些无效索引是否会影响系统的性能?带着这些问题我们一起来学习一下. ...

  7. mysql只能用一个索引_mysql只会使用到一个索引的原因

    select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar' 其中column1,colu ...

  8. mysql为什么用索引_MySql为什么使用B+树做索引

    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上.这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个 ...

  9. mysql中b树是什么_MySQL优化中B树索引知识点总结

    为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太长, 3.或等待时间太长 4.sql语句欠佳,以及我们索引失效 5.服务器参数设置不合理 SQL语句执行过程分 ...

最新文章

  1. 如何删除sublime目录
  2. 面积积分_被积函数的奇偶性问题(定积分、重积分、线积分、面积分)
  3. 常用的正则表达式验证类
  4. [python opencv 计算机视觉零基础到实战] 十二 直方图
  5. 2017西安交大ACM小学期数据结构 [分块、二维矩阵]
  6. 你应该知道的Windows复制技术
  7. css3动画与@keyframes关键帧
  8. 将您的Apple ID更改为其他电子邮件地址的方法
  9. 以ontouch为例说明android事件发送机制
  10. SIP呼叫中关于PRACK的使用
  11. 使用Python编写获取QQ群成员昵称及号码的小工具
  12. 《SpringMVC视频教程》(p2~p3)
  13. vue中实现axios封装
  14. linux ftp prompt off,FTP命令详解及使用技巧
  15. 配置计算机系统doc,计算机的基本配置.doc
  16. 常见汉字与不常见汉字
  17. HttpClient(4.5) post get https 实例
  18. 银河麒麟桌面操作系统V10 SP1 如何安装字体
  19. 没有计算机年代科学家如何计算,难倒了无数科学家的 三体问题
  20. 【Linux】 ubuntu16.04系统使用印象笔记

热门文章

  1. Sqlserver数据类型精解
  2. 证券行业日志审计需求分析,产品选型和实施建议
  3. 百度08年网页搜索份额73.2% 创历史新高
  4. Partition分区的使用案例
  5. 面试题02.07.链表相交
  6. 怎样的数据分析才有价值
  7. 互联网大数据对教育的重要性
  8. u盘最大单个文件支持多少g_小身材用处大,金属U盘功能不简单
  9. 图像处理、分析与机器视觉(基于labview)_基于3D技术的机器视觉解决方案
  10. java jtree怎么初始化,java – 如何设置JTree“ctrl”选择模式始终启用