java面试题:你了解mysql的B+TREE索引吗?

  • 什么是索引?

  索引是为了加速对表中数据行的检索而创建的一种分散储存的数据结构。

  工作原理:

  

  通过我们建立的索引,可以通过命中后的磁盘地址快速的找到我们需要的表数据,比起全表扫描去查询数据,可以大大的提升查找效率。

  在关系型数据库中,索引是硬盘级索引。

  • 常见的数据结构

  1)二叉树

  

  二叉树相信大家都非常熟悉,以一个节点为根节点,比该节点小的值走左边,大的值走右边。搜索数据时,只要通过它的数据链接就可找到相应的数据。右边为一个节点里的具体组成部分。

  缺点:二叉树有个极其致命的缺点,当插入数据为顺序递增或顺序递减时,形成的二叉树就成了单边链条。

  

  这样的话,查找也没有效率可言。

  2)平衡二叉查找树

  平衡二叉查找树作为二叉查找树的进阶版,改进了二叉查找树的缺点。

  定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

  即,当平衡二叉查找树数据插入时,如果发现形成的树结构违反了它的定义,那么此时树会发生形变,组成一颗相对平衡的查找树。

  如果还是以上面的1-5顺序插入时,形成的树结构为

  

  红黑树也是平衡二叉查找树的一种实现。

  因此不建议对数据频繁变更的列建立索引,因为在这个过程中,索引的结构变更必然会带来IO流和CPU的损耗。

  缺点:

    1.搜索效率不足。

      因为归根结底还是二叉树结构,因此在数据量大的时候,树的高度极高,也就意味着可能一次查找需要超多次数的IO。

    2.节点数据内容太少。

      每一个节点中保存的数据远远不够填满一次内存和磁盘交互的值。如果一次内存和磁盘的交互为4KB,那么一个节点中保存的数据其实就大大浪费了这个空间。

  3)B tree(多路平衡查找树,绝对平衡)

  

  那么B树如何解决平衡二叉树的缺点呢?

  上图是一个三路平衡查找树,因为Btree是多路平衡查找树的原因,它可以是三路,四路,五路六路,路越多,就意味着树的高度越低,那么一次搜索的最大IO次数也就越少。

  也因为它的多路特性,一次IO交互的磁盘块中可能保存着巨大数量的节点数据。我们以id为int为例,一次IO交互假设为4KB,那么一次IO交互最多能保存1024个关键字!(当然一个节点中有数据区和子节点引用,粗略计算)。

  因此我们在设置数据库的字段类型和字段长度的时候,控制字段类型合理,字段长度合理,就能保证每次索引磁盘块的加载能包含更多数据,从而提升我们的查找效率。

  4)B+tree(加强版多路绝对平衡查找树)

  我们还是以三路查找树为例

  

  B+树的特点:

  1. 非叶节点不保存数据相关信息,只保存关键字和子节点的引用。
  2. 所有的数据都保存的叶子节点中。
  3. 采用左闭合区间。
  4. 叶子节点中的数据顺序排列,并且相邻节点具有顺序引用的关系。  

  B+树相比B树的优点:

  1. 扫库、扫表能力更强
  2. 磁盘读写能力更强(因为少保存了个数据区)
  3. 排序能力更强
  4. 查找效率更加稳定(B树可能一次命中,也可能多次命中,而B+树因为没有保存数据区的缘故,树的高度相对更低,但每次都要查找到最多次数)
  • mysql中B+tree的具体落地形式(未完待续)
  1. myisam
  2. innodb

  

  

原文地址:https://www.cnblogs.com/keeplearningclc/p/10960890.html

时间: 2024-10-12 21:03:18

java面试题:你了解mysql的B+TREE索引吗?的相关文章

Java面试题下

这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题,如果需要了解相关内容,可以参考我的另一篇文章<Java面试题集(86-115)>.此外,这篇文章还对企业应用架构.大型网站架构和应用服务器优化等内容进行了简单的探讨,这些内容相信对面试会很有帮助. 126.什么是ORM?答:对象关系映射(Object-Relational Mapping,简称OR

Java笔试题解答和部分面试题

面试类  银行类的问题 问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你在一个线程里初始化了一个HashMap然后在多个其他线程里对其进行读取,这肯定没有任何问题.有个例子就是使用HashMap来存储系统配置项.当有多于一个线程对HashMap进行修改操作的时候才会真正产生问题,比如增加.删除.更新键值对的时候.因为put()操作可以造成重新分配存储大小(re-size

精选30道Java笔试题解答

个人觉得整理的超级好的Java笔试题,原文请见 http://blog.csdn.net/lanxuezaipiao/article/details/16753743 1. 下面哪些是Thread类的方法() A start()       B run()       C exit()       D getPriority() 答案:ABD 解析:看Java API docs吧:http://docs.oracle.com/javase/7/docs/api/,exit()是System类的方

java面试题 一

引言:准备要苦逼的找工作了,这是我最不愿意去面对的事情,因为我会被虐成渣渣,呵呵,事实总让人难以接受呀! 在网上找到的这份java面试题,所以转过来方便看,废话不多说了. 来源:http://www.importnew.com/22083.html 1.面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么.- 继承:继承是从已有类得到继承

华为的JAVA面试题及答案(部分)

华为的JAVA面试题 (后记:没有想到华为的面试题就是非同一般,非常多题不是一眼就行看得出来,至少对我这种鸟来说是这样.对我个人来说,看看这种题,可能比看<Think In Java>都还要好,由于这里面有非常多的东西,都是我们平时没有太在意,或者是仅仅是懂一点皮毛而已,通过做一下这种练习,把自己不知道.不熟悉的知识点,利用这个机会好好的巩固一下.这些答案是我自己做的,有一些是从网上来的,有一部是自己做的,而且另一部份没有做完,我不敢保证都对,所以请你在引用的时候,务必通过自己核对一下.当然,

Java面试题全集(下)

这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题,如果需要了解相关内容,可以参考我的另一篇文章<Java面试题集(86-115)>.此外,这篇文章还对企业应用架构.大型网站架构和应用服务器优化等内容进行了简单的探讨,这些内容相信对面试会很有帮助. 126.什么是ORM?答:对象关系映射(Object-Relational Mapping,简称OR

Java面试题全集(上)

2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的<Java面试大全>进行了全面的修订并重新发布在我的CSDN博客.在修订的过程中,参照了当时JDK最新版本(Java 7)给出了题目的答案和相关代码,去掉了EJB 2.x.JSF等无用内容或过时内容,补充了数据结构和算法.大型网站技术架构.设计模式.UML.Spring MVC等内容并对

Java面试题-1

Java面试题 Java面试题 1 1.面向对象的特征有哪些方面? 6 2.访问修饰符public,private,protected,以及不写(默认)时的区别? 7 3.String 是最基本的数据类型吗? 8 4.float f=3.4;是否正确? 8 5.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 8 6.Java有没有goto? 8 7.int和Integer有什么区别? 9 8.&和&&的区别? 11

【转】Java面试题全集(上)

准备从C#转java,在找工作之前准备看看面试题,有幸看到大神的作品,mark一下,以后慢慢看... 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的<Java面试大全>进行了全面的修订并重新发布在我的CSDN博客.在修订的过程中,参照了当时JDK最新版本(Java 7)给出了题目的答案和相关代码,去掉了EJB 2.x.JSF等无用内