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

图解 MySQL 索引:B-B+

本文中有关存储引擎请查看MySQL存储引擎-InnoDB和MyISAM 索引是什么? 索引是帮助MySQL高效获取数据的数据结构。 索引能干什么? 提高数据查询的效率。...二、索引的底层实现 mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B索引基础上建立hash...B-Tree索引(MySQL使用B+Tree) B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。 ?...相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。 ?...三、问题 问:为什么索引结构默认使用B-Tree,而不是hash,二叉,红黑? hash:虽然可以快速定位,但是没有顺序,IO复杂度高。

2K20

MySQL实现遍历

经常在一个表中有父子关系的两个字段,比如empno与manager,这种结构中需要用到遍历。...在Oracle 中可以使用connect by简单解决问题,但MySQL 5.1中还不支持(据说已纳入to do中),要自己写过程或函数来实现。...580',-1),          (16,'左上幻灯片',13),          (17,'帮忙',14),          (18,'栏目简介',17);   二、利用临时表和递归过程实现遍历...(mysql的UDF不能递归调用): [c-sharp] DELIMITER $$   USE `db1`$$   -- 从某节点向下遍历子节点   -- 递归生成临时表数据   DROP...目前来看无论哪种实现,效率都不太好,希望mysql自己能实现oracle 的connect by 功能,应该会比较优化。 参考:MySQL中进行树状所有子节点的查询

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

BB+的区别及MySQL为何选择B+

BB+的区别及MySQL为何选择B+ 1. BB+的定义 BB+都是一种多路搜索,常用于数据库和文件系统中进行索引操作。在介绍BB+的区别之前,先来了解一下它们的定义。...这意味着B+的磁盘I/O操作更少,因为在查询时不需要遍历非叶子节点。...B+在查询时只需要遍历一次叶子节点即可得到查询结果,而B则需要遍历非叶子节点和叶子节点,效率相对较低。 3....MySQL为什么选择B+MySQL中,索引是用来加速数据查询的,因此索引的设计非常重要。...MySQL采用的是B+作为索引的数据结构,原因如下: B+的查询性能更好,因为数据都存储在叶子节点中,查询时只需要遍历一次叶子节点即可得到查询结果。

50110

mysql b+优点_基础B

我:B+ 面试官:为什么要用B+,而不是B? 我:… 面试官:用B+作为MySql的索引结构,用什么好处?...我:… BB+MySQL索引使用的数据结构,对于索引优化和原理理解都非常重要,下面我的写文章就是要把BB+的神秘面纱揭开,让大家在面试的时候碰到这个知识点一往无前,不再成为你的知识盲点!...所以IO一次就是读一页的大小 总结 MySQLBB+原理就说到这里了,希望大家看完之后以后面试碰到这题会没有困难!...关注公众号后回复【资源】免费获取 2T 编程视频和电子书 参考 从 MongoDB 及 MysqlB/B+ MySQL索引背后的数据结构及算法原理 面试官问你BB+,就把这篇文章丢给他...面试官:为什么 MySQL 索引要使用 B+而不是其它树形结构?

57720

MySQL索引原理——B

1、MyISAM是MySQL 5.5之前版本默认的存储引擎,从5.5之后,InnoDB开始成为MySQL默认的存储引擎。MyISAM和InnoDB都是使用B+实现主键索引、唯一索引和非主键索引。...当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。...相比B-tree,B+tree有个好处,那就是方便扫库,B必须用中序遍历的方法按序扫库,而B+直接从叶子结点挨个扫一遍就完了,B+支持range-query非常方便,而B不支持。...mysql 底层存储是用B+实现的,因为MySQL的索引是存储在磁盘上的。内存中B+是没有优势的,但是一到磁盘,B+的威力就出来了。.../p/6868087.html  MySQLB的那些事

47710

MySQL索引底层实现原理(BB+

这里我们主要讨论一下MySQL InnoDB存储引擎,基于B-(但实际上MySQL采用的是B+树结构)的索引结构。...,就可以通过一次磁盘I/O把一个磁盘块的数据全部存储下来,所以当使用B-存储索引的时候,磁盘I/O的操作次数是最少的(MySQL的读写瓶颈,主要集中在磁盘I/O上) 数据和索引都是放在磁盘上的,MySQL...做范围搜索和整表遍历的时候直接遍历这个有序链表即可,不用遍历平衡MySQL最终为什么要采用B+存储索引结构?...而B非叶子节点相邻索引值之间的区间比B+要大 B不方便做范围搜索(where age between 10 and 20),整表遍历也不方便。...而B+将所有的叶子节点都串在链表上,做区间搜索以及整表遍历比平衡快 当我们回答问题的时候,不要1 2 3这样把答案背出来,这样效果是很差的,我们回答索引的底层原理的时候可以这样回答: 当我们select

60720

B B- B+ B*

实际使用的B都是在原B的基础上加上平衡算法,即“平衡二叉”;如何保持B结点分布均匀的平衡算法是平衡二叉的关键;平衡算法是一种在B中插入和删除结点的策略; B- 是一种多路搜索(并不是二叉的...M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并; B+        B+B-的变体,也是一种多路搜索:        1.其定义基本与B-同,除了:        2.非叶子结点的子树指针与关键字个数相同...B+的搜索与B-也基本相同,区别是B+只有达到叶子结点才命中(B-可以在 非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;     B+的特性:        1.所有关键字都出现在叶子结点的链表中...B+的变体,在B+的非根和非叶子结点再增加指向兄弟的指针; ?   ...分配新结点的概率比B+要低,空间使用率更高; 小结 B:二叉,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点; B-:多路搜索,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点

1.6K70

为什么MySQL索引要用B+,而不是B

MySQL 中我们的 InnoDB 页的大小默认是 16K,当然也可以通过参数设置: mysql> show variables like 'innodb_page_size'; +-------...因为我们不知道要查找的数据存在哪个页中,也不可能把所有的页遍历一遍,那样太慢了。 所以人们想了一个办法,用 B+ 的方式组织这些数据,如下图所示: ?...这里我们先假设 B+ 高为 2,即存在一个根节点和若干个叶子节点,那么这棵 B+ 的存放总记录数为:根节点指针数*单个叶子节点记录行数。...怎么得到 InnoDB 主键索引 B+ 的高度? 上面我们通过推断得出 B+ 的高度通常是 1-3,下面我们从另外一个侧面证明这个结论。...最后回顾一道 MySQL 面试题:为什么 MySQL 的索引要使用 B+ 而不是其他树形结构?比如 B ?现在这个问题的复杂版本可以参考本文。

72810

MySQL为什么用B+,而不用B

面试题1: MySQL为什么用B+,而不用B?...1.b+只有叶子节点存数据 b是每个节点都存数据 在相同数据量下b的高度更高,所以查询效率更低 2.b每一层存的是数据+索引; b+是除了叶子节点存的是数据+索引以外,其余节点只存索引,所以在相同数据量的情况下...,b的高度会比b+ 高很多 面试题2:微服务架构中日志有什么好方案吗?...本地分析一般是在宿主机上安装代理,执行分析命令,上报到服务器 面试题3:Mysql主从的延迟怎么解决呢,有什么好的思路吗?...3.服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力。 4.不同业务的mysql物理上放在不同机器,分散压力。

97220

MySQLB+索引.

B+ 是为磁盘或其他直接存取辅助设备设计的一种平衡查找B+ 中的 B 不是代表二叉(binary),而是代表平衡(balance)。...在 B+ 中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接,叶子节点之间组成一个双向链表。 ?...B+ 索引的本质就是 B+ 在数据库中的实现,但是 B+ 索引在数据库中有一个特点是高扇出性(数据库分区),因此在数据库中,B+ 的高度一般都在 2-4 层,这也就是说查找某一键值的行记录时最多只需要...数据库中的 B+ 索引可以分为 聚集索引和辅助索引。 B+ 索引并不能找到一个给定键值的具体行。B+ 索引能找到的只是被查找数据行所在的页。...从本质上来说,联合索引也是一棵B+ 。那么什么时候会使用到联合索引呢?"

96920

多叉 & B & B+ & B*

(2). 2-3-4: 和2-3的区别就是,它还允许节点有三个元素且有四个子节点。 4. BB是balance,平衡的意思,所以,B首先是一棵平衡,而平衡首先得是一棵排序数。...所以B就是一棵平衡的、排序的多叉B的相关说明如下: B的阶:节点的最多子节点个数叫做阶。...比如2-3的阶就是3,2-3-4的阶就是4; B的搜索:从根节点开始,对节点内的元素进行二分查找,如果找到就结束,否则进入查找元素所属范围的子节点再进行二分查找,直到找到或者到达叶子节点; B的所有节点都会存放数据...B+B+B的变体,和B的区别就是,B+所有数据都存放在叶子节点。...B+一般用于文件系统; 6. B*B*又是B+的变体,就是在B+的基础上,在非根非叶子节点之间增加了指向兄弟节点的指针。

1.5K20

为什么Mongodb索引用B,而MysqlB+?

正文 这里的Mysql指的是Innodb的存储引擎下的索引结构,其他存储引擎我们暂时不讨论。 BB+ 开头,我们先回忆一下,BB+的结构以及特点,如下所示: B ?...但是,B+的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+非常适合做范围查询。...因此,我们可以做一个推论:没准是Mysql中数据遍历操作比较多,所以用B+作为索引结构。而Mongodb是做单一查询比较多,数据遍历操作比较少,所以用B作为索引结构。...那么为什么Mysql做数据遍历操作多?而Mongodb做数据遍历操作少呢? 因为Mysql是关系型数据库,而Mongodb是非关系型数据。 那为什么关系型数据库,做数据遍历操作多?...我:"巴拉巴拉" 面试官:"为什么Mongodb索引用B,而MysqlB+?" 然后你就回去等通知了! 套路三 你简历既没写mysql,没写mongodb!

1.3K10

为什么Mongodb索引用B,而MysqlB+?

正文 这里的Mysql指的是Innodb的存储引擎下的索引结构,其他存储引擎我们暂时不讨论。 BB+ 开头,我们先回忆一下,BB+的结构以及特点,如下所示: B ?...但是,B+的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+非常适合做范围查询。...因此,我们可以做一个推论:没准是Mysql中数据遍历操作比较多,所以用B+作为索引结构。而Mongodb是做单一查询比较多,数据遍历操作比较少,所以用B作为索引结构。...那么为什么Mysql做数据遍历操作多?而Mongodb做数据遍历操作少呢? 因为Mysql是关系型数据库,而Mongodb是非关系型数据。 那为什么关系型数据库,做数据遍历操作多?...我:"巴拉巴拉" 面试官:"为什么Mongodb索引用B,而MysqlB+?" 然后你就回去等通知了! 套路三 你简历既没写mysql,没写mongodb!

1.9K30

B B+ B* 谈到R

数据库索引采用B+的主要原因是 B在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+应运而生。B+只要遍历叶子节点就可以实现整棵遍历。...对于像MySQL,DB2,Oracle等数据库中的索引结构得有较深入的了解才行,建议去找一些B 相关的开源代码研究。 ?...走进搜索引擎的作者梁斌老师针对BB+给出了他的意见(为了真实性,特引用其原话,未作任何改动): “B+还有一个最大的好处,方便扫库,B必须用中序遍历的方法按序扫库,而B+直接从叶子结点挨个扫一遍就完了...Bucket Li:"mysql 底层存储是用B+实现的,知道为什么么。内存中B+是没有优势的,但是一到磁盘,B+的威力就出来了"。...一个典型的B查找如下: ? 要查找某一满足条件的点,先去找到满足条件的线段,然后遍历所在线段上的点,即可找到答案。

2.1K10
领券