一篇文章带你了解清楚索引中的B树和B+树的结构

1 基本概念
1 索引 :是特殊数据结构,定义在查找时作为查找条件的字段,在mysql 又称为key ,索引是通过存储引擎来实现的.

优点:索引可以降低服务所需要扫描的数量,减少IO 访问的次数 ,

? 索引可以帮助服务器避免排序和使用临时表,索引可以帮助将随机的IO 转换为顺序IO .

缺点: 占用额外的空间,影响插入的速度.

2 索引的类型

聚簇索引 非聚簇索引 在页节点中数据的存放和索引的存放在一起就是聚簇索引,如果不在一起就是非聚簇索引.myisam 非聚簇索引,innodb聚簇索引.

稠密索引 稀疏索引 是否索引了每一个数据项,如果索引指向的是一个具体数据则是稠密索引,如果索引指向的数据的一个范围就是稀疏索引.

主键索引 二级索引 : 主键本身就是一个索引,按主键顺序来存放数据的顺序,在innodb 中二级索引就是指向主机索引的索引,主键索引本身指向数据,而二级索引指向主键索引 间接的指向数据,

下面来重点 看图
B树结构

B+树结构

磁盘中存储数据的是以块为单位进行存放的,每个块的大小是固定的,按其逻辑结构可以将数据的存放形式分为三段 ,第一段为根节点 第二段为分支节点 第三段为叶子节点,在一张表中建立了索引就是将表中的某一个或多个字段按逻辑顺序进行了排序,如我们对学生表的学生编号建立了索引,索引的范围是1-30号,在根节点中系统会在范围中取几个编号来存放在根节点中,如取了 10 17编号,则 根节点的指针第一个指向 小于10编号的一个范围指针,第二个指针指向10-17这范围的指针 第三个指针指向了17-30这个范围的指针,通过根节点和分支节点的层层索引就定位到了每一个数据的物理地址上.

B树中 根节点还是分支节点中 不仅存放了稀疏索引还存放了数据,这样在数据块大小是固定的情形下,存放的索引的数量就会较少,特别是在当记录的字段比较多时,此时索引指针的数量就会更少,索引指针的数量少 ,整个树形结构就会层级很多, 每次查找的效率就不会很高,但在B+tree 中树所有的根节点和分支节点都只存放了索引并不存放真正的数据,这样存放的索引就跟多,整个树的层级就会跟少,查找的效率就会更高,

B树种每个页节点都是指向了数据块的物理地址,数据块之间是没有直接联系的,而且数控块和页节点是分离的,这一点也可以从myisam 的文件存放结构可以看出来,myisam 默认就是BTREE结构,当个表 被分别存放在三个文件中,一个文件存放表中的记录数据,一个表存放表的结构,一个表存放表的索引,三项数据都不在一个表上,而 innodb 是B+TREE的结构,他的索引和数据是存放在一张表上的, B+TREE 中在叶子节点上 数据和表是存放在一起的,
而且数据的存放和表的索引存放顺序是完全一致的,数据的存放顺序和表的存放顺便是靠链表来实现的, 这样在对一个范围进行查找时,本来是随机I/0的访问变成了顺便访问,将很大的提高磁盘的访问效率.而Btree 结构对范围查找是无能为力的只能一层层去查找.B+TREE 中根节点和分支节点是不存放数据的,也就是说对单个数据的查找,B+TREE是访问的层级是固定的,
而 BTREE 中是不固定的,本质是因为他的根节点和分支节点上都存放了部分的数据,由于单个数据块中存放的索引指针少,层级多,访问效率是比B+TREE 要低的,但是凡事要辩证的看问题,在B+TREE这种数据和索引在一个起并且数据的存放顺序和索引存放的顺序是一样的这样的结构下,当你插入一条数据的,还插入的在前面的时候时,整个数据的结构被打乱,插入数据所在位置的后面的数据都要重新建立索引和数据,这样无形中大大增加了I/O的访问,因此在设计有大量写操作时,B+TREE的劣势尽显,而BTREE来说对他的影响是比较小.因此我们要根据实际生产来选择.

B树中 根节点还是分支节点中 不仅存放了稀疏索引还存放了数据,这样在数据块大小是固定的情形下,存放的索引的数量就会较少,特别是在当记录的字段比较多时,此时索引指针的数量就会更少,索引指针的数量少 ,整个树形结构就会层级很多, 每次查找的效率就不会很高,但在B+tree 中树所有的根节点和分支节点都只存放了索引并不存放真正的数据,这样存放的索引就跟多,整个树的层级就会跟少,查找的效率就会更高,

B树种每个页节点都是指向了数据块的物理地址,数据块之间是没有直接联系的,而且数控块和页节点是分离的,这一点也可以从myisam 的文件存放结构可以看出来,myisam 默认就是BTREE结构,当个表 被分别存放在三个文件中,一个文件存放表中的记录数据,一个表存放表的结构,一个表存放表的索引,三项数据都不在一个表上,而 innodb 是B+TREE的结构,他的索引和数据是存放在一张表上的, B+TREE 中在叶子节点上 数据和表是存放在一起的,
而且数据的存放和表的索引存放顺序是完全一致的,数据的存放顺序和表的存放顺便是靠链表来实现的, 这样在对一个范围进行查找时,本来是随机I/0的访问变成了顺便访问,将很大的提高磁盘的访问效率.而Btree 结构对范围查找是无能为力的只能一层层去查找.B+TREE 中根节点和分支节点是不存放数据的,也就是说对单个数据的查找,B+TREE是访问的层级是固定的,
而 BTREE 中是不固定的,本质是因为他的根节点和分支节点上都存放了部分的数据,由于单个数据块中存放的索引指针少,层级多,访问效率是比B+TREE 要低的,但是凡事要辩证的看问题,在B+TREE这种数据和索引在一个起并且数据的存放顺序和索引存放的顺序是一样的这样的结构下,当你插入一条数据的,还插入的在前面的时候时,整个数据的结构被打乱,插入数据所在位置的后面的数据都要重新建立索引和数据,这样无形中大大增加了I/O的访问,因此在设计有大量写操作时,B+TREE的劣势尽显,而BTREE来说对他的影响是比较小.因此我们要根据实际生产来选择.

原文地址:https://blog.51cto.com/2858259639/2419883

时间: 2024-10-13 20:38:56

一篇文章带你了解清楚索引中的B树和B+树的结构的相关文章

一篇文章带你了解spring框架

虽然现在流行用SpringBoot了,很多配置已经简化和封装了,但是对于Spring的一些基础我们了解一些是对我们自己的架构思想很有帮助的!接下来和笔者一起来探讨一下Spring框架吧! 1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发.Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安

一篇文章带你搞懂DEX文件的结构

DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看,跟着我做.看再多遍不如自己亲自实践一遍来的可靠,别问我为什么知道.泪崩ing..... 首先,我们需要自己构造一个dex文件,因为自己构造的比较简单,分析起来比较容易.等你简单的会了,难的自然也就懂了. 0x00■  构造DEX文件 首先,我们编写一个简单的Java程序,如下: public class HelloWorld { int a = 0; static

一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2) { // 函数体 } 在Firefox,Safari,Chrome和Opera有效: 就是通过这个属性可以访问到这个函数指定的名字. console.log(functionName.name); // 'functionName' 函数声明: 它的一个重要特点就是:函数声明提升,就是在执行代码

一篇文章带你了解JavaScript中的语法,数据类型,流程控制语句以及函数

作者 | Jeskson 来源 | 达达前端小酒馆 1 JavaScript有多重要啊,才能让我说说一下,其中的语法,操作符,数据类型,内置功能等. 语法: 在JavaScript中的变量,函数名和操作符都是区分大小写的,所以变量名Da和变量名da分别为两个不同的变量. 标识符: 什么是标识符?它是指变量,函数,属性的名称,以及函数的参数. 标识符的规则: 一:第一个字符必须是,一个字母,下划线,或者是,一个美元符号 二:后面的字符,可以是字母,下划线,或是数字. 在JavaScript中标识符

一篇文章带你了解JavaScript中的变量,作用域和内存问题

作者 | Jeskson 来源 | 达达前端小酒馆 1 在JavaScript中的变量分别区分为两种: 一种为基本类型值,一种为引用类型值. 基本类型值指的是简单的数据段 引用类型值为可能由多个值组成的对象 引用类型的值是保存在内存中的对象,JavaScript不允许直接操作对象的内存空间,实际上操作对象的引用而不是实际对象. var dada = new Object(); undefined dada.name = "dada"; "dada" console.

一篇文章带你了解JavaScript中的基础算法之“字符串类”

作者 | Jeskson 来源 | 达达前端小酒馆 1 算法可以干什么呢?提高什么?有什么好处呢? 前端的同学需要提升编程核心内功,建立和健全算法知识体系,基础算法.数据结构.进阶算法,由浅入深讲解,透彻理解抽象算法,算法面试是关键一环,冲击大厂前端offer. 学习算法前掌握ES6哦!需要掌握单元测试的语言,Jest Jest is a delightful JavaScript Testing Framework with a focus on simplicity. It works wi

一篇文章带你了解JavaScript中的面向 “对象”

作者 | Jeskson 来源 | 达达前端小酒馆 安装webpack,打包工具,安装webpack-dev-server,安装babel解析es6语法,初始化npm环境. npm install webpack webpack-cli --save-dev webpack.dev.config.js module.exports = { entry: './src/index.js', output: { path: __dirname, filename: './release/bundle

一篇文章带你入门Linux——马哥Linux基础学习笔记

1.课程体系: 中级: 初级:系统基础 中级:系统管理.服务安全及服务管理.Shell脚本: 高级: MySQL数据库: cache & storage 集群: Cluster lb: 4layer 7layer ha: 分布式: zookeeper 分布式文件系统 虚拟化技术: xen kvm Openstack:IAAS云: 运维工具: ansible puppet(ruby), saltstack(python) 监控工具: zabbix 大数据处理: hadoop spark, stor

什么是网络爬虫?有什么用?怎么爬?一篇文章带你领略python爬虫的魅力

网络爬虫也叫做网络机器人,可以代替人们自动地在互联网中进行数据信息的采集与整理.在大数据时代,信息的采集是一项重要的工作,如果单纯靠人力进行信息采集,不仅低效繁琐,搜集的成本也会提高. 此时,我们可以使用网络爬虫对数据信息进行自动采集,比如应用于搜索引擎中对站点进行爬取收录,应用于数据分析与挖掘中对数据进行采集,应用于金融分析中对金融数据进行采集,除此之外,还可以将网络爬虫应用于舆情监测与分析.目标客户数据的收集等各个领域. 当然,要学习网络爬虫开发,首先需要认识网络爬虫,本文将带领大家一起认识