首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

B+索引

引言 时隔一年,我又想起当初看数据库时,看到的B+,就是数据库的索引使用的数据结构。再整理一下,看看自己没有忘记很多吧。 概述 B+之前,先来看一下二叉查找(1,2,3,4,5,6,7) ?...那么把上面修改一下,让二叉查找的叶子节点直接指向数组的下标不就好了嘛。修改后结构如下: ?...既然如此,那就降低IO好了,增加每一层的节点数量,也就是二叉变成n叉(也确实是这么做的)。...算一下,如果是3叉,高度为3(这个高度为索引的高度),可索引的数组长度为:(3^4=81);如果是5叉,高度为3,可索引数组长度为:(5^4=625);如果是100叉,高度为3,可索引长度为:(...索引1亿的数据量,高度也只有3,意味着只要进行3此IO就可以定位到。完美。 那进行分叉过多,是不是在每个节点搜索子节点的效率下降了?这里可以再使用一些查找算法降低时间复杂度。

85720

MyISAM主键索引和二级索引

MyISAM:数据和索引没有放在一块,叫做 非聚集索引,不可能回表 InnoDB:数据和索引存放在一块,叫聚集索引 ,会涉及回表 此时假设一个场景:uid是主键,有主键索引,name有索引,创建二级索引...当前场景下的主键索引如下,B+非叶子节点上只有索引值,叶子节点上有索引值和数据地址 MyISAM索引原理图如下: 当前场景下的二级索引如下: InnoDB二级索引树叶子节点上是主键值uid,...而MyISAM存的则是数据的地址 当前场景下,主键索引和二级索引两者之间的联系: 在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的...,而辅助索引的key可以重复,MyISAM二级索引树结构图如下: 当前场景下,若使用MyISAM存储引擎查找数据,以name作为索引,到二级索引树上查找结果(构造索引的过程也涉及磁盘I/O),如果指定的...MyISAM存储引擎,B+树叶子节点存储关键字和数据地址,也就是说索引关键字和数据没有在一起存放,体现在磁盘上,表的数据存放在*.MYD文件中,表的索引存放在*.MYI文件中。

16520
您找到你想要的搜索结果了吗?
是的
没有找到

InnoDB主键索引和二级索引

由于name没有索引,于是做整表搜索 select * from student where name='linfeng'; 场景2:二级索引 uid是主键,以name创建了普通索引(二级索引)...以name为索引构建的索引,称为辅助索引,也叫做二级索引。...; 这种情况select的是name和uid,而这些在二级索引树上也是直接就有,所以搜索二级索引就完事了。...我们的过滤条件是age,先给age添加索引,看看行不行 可以看到,age命中索引了,查询age所在的索引。由于我们写的是select *,依然存在回表。...不能,因为一次SQL执行只能用到1个索引,搜索了这个字段的索引就不会再去搜索另一个字段的索引了,因为加载索引是要耗费磁盘I/O的,查找多个索引就太慢了!

15320

索引中的b索引

1.索引如果没有特别指明类型,一般是说b索引,b索引使用b数据结构存储数据,实际上很多存储引擎使用的是b+,每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历 2.底层的存储引擎也可能使用不同的存储结构...,比如NDB集群存储引擎使用了T,InnoDB使用的是B+ 3.MyISAM使用前缀压缩技术使得索引更小,InnoDB按照原数据格式进行存储,MyISAM通过数据的物理位置引用被索引的行,InnoDB...根据主键引用被索引的行 4.b意味着所有的值是按照顺序存储的,并且每一个叶子页到根的距离相同 5.b索引能够加快访问数据的速度,存储引擎不需要再进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索...,根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找.通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点.的深度和表的大小直接相关 6.叶子节点比较特别,他们的指针指向的是被索引的数据...,而不是其他的节点页 7.b索引列是顺序存储的,所以很适合查找范围数据. 8.索引对多个值进行排序的依据是,定义索引时列的顺序,比如联合索引key(a,b,c),这三个列的顺序 9.上面的联合索引对以下查询语句有效

1.3K20

MySQL索引原理——B

MyISAM和InnoDB都是使用B+实现主键索引、唯一索引和非主键索引。 2、InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。...而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。...3)InnoDB辅助索引与null 值为NULL的二级索引记录被放在了B+的最左边,这是因为设计InnoDB的大叔有这样的规定: We define the SQL null to be the...10、总结: 通过以上介绍,大致将B,B+,B*总结如下: B:有序数组+平衡多叉; B+:有序数组链表+平衡多叉; B*:一棵丰满的B+。...mysql 底层存储是用B+实现的,因为MySQL的索引是存储在磁盘上的。内存中B+是没有优势的,但是一到磁盘,B+的威力就出来了。

48310

空间索引 - 四叉

分类 四叉常见的应用有图像处理、空间数据索引、2D中的快速碰撞检测、稀疏数据等,今天我们很纯粹地只介绍它在空间索引方面的应用。...根据其存储内容,四叉可以分为点四叉、边四叉和块四叉,今天我们实现的是点四叉。 根据其结构,四叉分为满四叉和非满四叉。...以下是一个非满点四叉的实现: 附上 GitHub 仓库地址:枕边书-空间索引 代码实现 首先是数据结构的定义: 结点: struct QuadTreeNode { int depth; //...这里我们要介绍四叉的另一个特性。 字典 字典,又称前缀或trie,是一种有序,用于保存关联数组,其中的键通常是字符串。...看过我上一篇空间索引(详见:空间索引 - GeoHash算法及其实现优化)文章的小伙伴可能会说,这不就是 GeoHash 么?

2.5K100

图解 MySQL 索引:B-、B+

2️⃣从应用层次来分:普通索引,唯一索引,复合索引 3️⃣根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。...普通索引:即一个索引只包含单个列,一个表可以有多个单列索引 唯一索引索引列的值必须唯一,但允许有空值 复合索引:即一个索引包含多个列 聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式...二、索引的底层实现 mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B索引基础上建立hash...三、问题 问:为什么索引结构默认使用B-Tree,而不是hash,二叉,红黑? hash:虽然可以快速定位,但是没有顺序,IO复杂度高。...二叉的高度不均匀,不能自平衡,查找效率跟数据有关(的高度),并且IO代价高。 红黑的高度随着数据量增加而增加,IO代价高。 问:为什么官方建议使用自增长主键作为索引

2K20

MySQL B+索引和哈希索引的区别

MySQL中最常见的索引类型有B+索引 和 哈希索引,下面来简单介绍一下这两种索引类型有哪些差别和优劣。...B+索引 B+索引是一种多路径的平衡搜索,具有如下特点: 1.非叶子节点不保存数据,只保存索引值 2.叶子节点保存所有的索引值和数据 3.同级节点通过指针自小而大顺序链接 4.节点内的数据也是自小而大顺序存放...非叶子节点不存储数据,因此几乎都能放在内存中,搜索效率更高 单节点中可存储的数据更多,平均扫描I/O请求更少 平均查询效率稳定(每次查询都从根结点到叶子结点,查询路径长度相同) 缺点 新增数据不是按顺序递增时...,索引需要重新排列,容易造成碎片和页分裂情况。...哈希索引 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快,具有如下特点: 1.哈希索引建立在哈希表的基础上

65010

MySQL 的B+索引.

一、B+索引概述 索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响(需维护索引的结构和数据);而索引太少,对查询性能又会产生影响。...二叉,左子树的键值总是小于根的键值,右子树的键值总是大于根的键值。 平衡二叉(AVL),任何节点的两个子树的高度最大差为 1。平衡二叉的查询速度很快,但是维护一棵平衡二叉的代价是非常大的。...B+ 索引的本质就是 B+ 在数据库中的实现,但是 B+ 索引在数据库中有一个特点是高扇出性(数据库分区),因此在数据库中,B+ 的高度一般都在 2-4 层,这也就是说查找某一键值的行记录时最多只需要...数据库中的 B+ 索引可以分为 聚集索引和辅助索引。 B+ 索引并不能找到一个给定键值的具体行。B+ 索引能找到的只是被查找数据行所在的页。...三、联合索引 联合索引是指对表上的多个列进行索引。从本质上来说,联合索引也是一棵B+ 。那么什么时候会使用到联合索引呢?"

97420

第15期:索引设计(索引组织方式 B+

谈到索引,大家并不陌生。索引本身是一种数据结构,存在的目的主要是为了缩短数据检索的时间,最大程度减少磁盘 IO。...MySQL 支持的索引结构有四种:B+ ,R ,HASH,FULLTEXT。...本篇简单介绍下 B+ ,下一篇讲 MySQL 常用的两种引擎 MyISAM 和 InnoDB 的 B+ 索引实现,其余的后面会讲到。 一、什么是二叉?...四、B+ B+ 是对 B 的一个小升级。大部分数据库的索引都是基于 B+ 存储的。MySQL 的 MyISAM 和 InnoDB 引擎的索引都是基于 B+ 存储。...可以看到,B+ 同时具有平衡多叉和链表的优点,即可兼顾 B 对范围查找的高效,又可兼顾链表随机写入的高效, 这也是大部分数据库都用 B+ 来存储索引的原因。

28810

MySQL的B+索引和hash索引的区别

索引类型:InnoDB引擎,默认B+(O(logN))、Hash索引 B索引 O(1) 1、由于底层是使用hash表,以key-value存储,无法直接通过索引查询,只选择一个数据hash索引更快...,但是如果选择N条数据,hash索引的时间复杂度是O(N),由于B+索引有序,且叶子节点有链表连接,查询效率比hash索引快 2、索引在硬盘保存,一般不会一次性保存到内存中,B+可以设计允许数据分批加载...,同时的高度较低,查询速率较快 3、硬盘的I/O速度相比内存来说非常慢,而索引是用于加快查询速度的,需要减少I/O操作,内存和磁盘以页为单位交换数据,为了减少I/O,索引在新建节点的时候,是直接申请一个页的空间...4、B+ 是平衡,它查找任意节点所耗费的时间都是完全相同的,比较的次数就是 B+ 的高度 B+ Tree索引和Hash索引区别?...而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引** 聚簇索引查询会更快,因为主键索引的叶子节点直接就是我们要查询的整行数据了。

83521

MySQL索引底层实现原理(B和B+

一、B-索引 1....理论部分 数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引的节点),索引越低,越矮胖,磁盘IO次数就少 MySQL支持两种索引,一种的B...-索引,一种是哈希索引,B-和哈希表在数据查询时的效率是非常高的。...关于操作系统从磁盘读取索引文件到内存中的几个问题 索引文件在磁盘上存储,磁盘的索引文件中的索引就是已经按B+构建好的吗?...操作系统把磁盘的索引文件读到内存上构建B+,如果磁盘的索引文件太大,内存读不下怎么办?那磁盘IO怎么算次数,现在不是都在内存上的B+搜索读取数据了吗?

70320

B+|MYSQL索引使用原则

一、存储引擎的比较 注:上面提到的B索引并没有指出是B-Tree和B+Tree索引,但是B-和B+的定义是有区别的。...接下来我们先看看B-、B+的概念。弄清楚,为什么加了索引查询速度会加快?...二、B-、B+概念 B 即二叉搜索: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树...; B+ B+是B-的变体,也是一种多路搜索: 1.其定义基本与B-同,除了: 2.非叶子结点的子树指针与关键字个数相同; 3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[...= ’2014-05-29’就不能使用到索引,原因很简单,b+中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。

39620

性能优化:认识B索引分裂

在数据库运维中,索引分裂是很常见的问题,这一期我们就跟随作者的脚步去认识索引分裂,为以后的索引维护打好基础。...如何分裂 当一个事务需要修改(大多数情况是Insert操作,某些情况下也可能为 Delete 操作)索引块(枝节点或叶子节点)上的数据,但没有足够空间容纳新的数据(包括索引条目、ITL slot)时,会将原有块上的部分数据放到一个新的数据块上去...,这一过程就是索引块分裂(Index Block Splitting)。...,在下面例子中,字段在索引中的顺序不同直接导致了索引的高度不同: 可以看到,idx_split_idx1和idx_split_idx2 中的字段是一样的,因此它们的叶子节点数也是一样的,但是因为它们的数据分布性不同以及在索引中的位置不相同...,导致它们的枝节点的数量和索引高度有很大的差别。

1.7K30

Innodb的B+索引(1)

InnoDB的B+索引(一) 今天我们说说B+索引的概念,B+索引和数据页也是分不开的,我们知道,磁盘和内存之间的数据交换是通过数据页来实现的,而最小的数据页的大小是16KB,为了能够更加清楚的描述...下面我们再说说索引的概念,大家都知道,索引类似于一个字典的目录,索引的创建是为了查询高效,或者说直观的概念就是在某个列上创建索引,那么这个列上的查询速度就会变快,但是索引也不是越多越好,索引的维护需要一定的成本...上面这棵,便是我们所说的表的B+索引。 我们可以看到,叶子节点上包含了该条数据记录的所有字段数据,我们称这种索引为聚集索引。...在我们的建表语句中,我们使用id列作为主键,那么这棵,就是以id列为索引键的聚集索引。 ?...看到这里,可能有的同学会担心这棵的会越来越高,最后查询的速度也会减慢,我们现在试想这样一组数据,假设目录项每一层的数据页可以保存1000条目录项记录,如果我们这棵的高度是4,那么一共可以保存的记录数就是

42631

索引数据结构B与B+对比

索引数据结构查询性能的决定因素 索引只能放在硬盘中,因此硬盘的I/O次数决定了索引数据结构查询性能的好坏 B B 进行查找。...B+ 查找关键字 16,B+ 会自顶向下逐层进行查找: 1.与根节点的关键字 (1,18,35) 进行比较,16 在 1 和 18 之间,得到指针 P1(指向磁盘块 2) 2.找到磁盘块 2...B与B+的区别 1.B+的查询效率更稳定: B+每次之后访问到叶子节点才能找到对应的数据,而在B,非叶子节点也会存储数据,这样会造成查询效率不稳定的情况,有时候访问到了非叶子节点就可以找到关键字...,而有事需要访问到叶子节点才能找到关键字 2.B+的查询效率更高 B+比B更胖矮(阶数更大,深度更低),查询所需要的磁盘I/O也会更少。...同样的磁盘页大小,B+可以存储更多的节点关键字。

7110

MySQL索引底层:B+详解

前言 当我们发现SQL执行很慢的时候,自然而然想到的就是加索引。对于范围查询,索引的底层结构就是B+。...一颗3阶的B+如下: ? B+和B-的主要区别如下: B-内部节点是保存数据的;而B+内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。...B+经典面试题 InnoDB一棵B+可以存放多少行数据? 为什么索引结构默认使用B+,而不是hash,二叉,红黑,B-?...为什么索引结构默认使用B+,而不是B-Tree,Hash哈希,二叉,红黑? 简单版回答如下: Hash哈希,只适合等值查询,不适合范围查询。...红黑,是一种特化的平衡二叉,MySQL 数据量很大的时候,索引的体积也会很大,内存放不下的而从磁盘读取,的层次太高的话,读取磁盘的次数就多了。

56100

MySQL 系列教程之(十)索引原理:B+ 索引

的深度与表的大小直接相关。 B+Tree索引是按照顺序组织存储的,所以适合范围查找数据 B+Tree索引使用与全键值、键值范围或者键前缀查找,其中键前缀进适用于根据最左前缀的查找。.../imgs/B-Tree.索引.png) B+Tree [在这里插入图片描述] 为什么使用B+而不是B 1.磁盘读写代价更低 在计算机中,所有与空间相关的东西都是按照块(block)进行存取和操作的....每次读取都意味着一次I/O 假设计算机中每个块的大小为4K,行的大小为1k,索引的大小为0.06K,就可以计算并得出结果 B的数据和索引都在同一个节点上,那么意味着每一个块(block)中包含的索引是少量的...,如果想要取出比较深层的数据就意味着要读取很多的快,才能得到想要的索引和数据,那就是I/O的次数会多 而B+中每一个块能够存储的索引数量是B的很多倍,那么获取比较深层的数据只需要读取少量的快(block...IO,而B+需要更多的顺序IO,因此B+,效率也更快 3.查询速度更稳定 由于B+Tree非叶子节点不存储数据(data),因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的

12K43
领券