首页
学习
活动
专区
圈层
工具
发布

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中进行树状所有子节点的查询

2.1K80

【MYSQL】 ——索引(B树B+树)、设计栈

在数据库中,进行条件查询的时候,我们经常需要遍历表,数据库是把数据存储在硬盘上,此处的时间复杂度O(N)比数据结构中的O(N)要慢很多,因此就可以给数据库引入索引,来提高查询的速度。...之前我们学习的MySQL中的parimary key 和 foreign key 和 unique 都会自动生成索引,这几个操作都会频繁涉及到查询 一:索引的特点 1:加快查询的速度 2:索引自身是一定的数据结构...B树又叫B-树(非念B减树,只是符号),B树是一个有序的N叉搜索树,每一个节点上可能有N个值,N个值划分出来N+1个区间 特点: ①:同样高度的B树和二叉搜索树,前者能表示的元素个数更多 ②:在搜索的时候...B树的比较次数更多 ③:虽然B树总的比较次数更多,但是B树的硬盘IO读取次数更少,成本更低(一次硬盘读取相当于内存1w次比较) 解释:同样多的元素个数下,B树存储元素所需要的节点数更少,而硬盘1次读取,...是把节点中所有元素一次性读取出来, 2:B+树 在B树的基础上,做出了改进,B+树也是N叉搜索树,划分出来N个区间,根节点上的最后一个值为最大/小值 特点: (1):B+树一个节点中有N 个key,每个

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

    图解 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复杂度高。

    2.8K20

    B树、B+树的区别及MySQL为何选择B+树

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

    2.5K10

    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  MySQL和B树的那些事

    1.3K10

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

    这里我们主要讨论一下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

    3.9K30

    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个关键字,非叶子结点存储指向关键字范围的子结点

    2.4K71

    为什么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 树?现在这个问题的复杂版本可以参考本文。

    1.2K10

    MySQL索引B+树详解

    MySQL 的 InnoDB 存储引擎使用 B+树 作为其索引的底层数据结构,这是实现高效数据检索、范围查询、排序和保证事务特性的核心。...下面是对 MySQL 索引 B+ 树的详细解析: B+ 树的核心设计目标适配磁盘存储: 磁盘 I/O(读取/写入数据块)是数据库操作的主要性能瓶颈。...五、 B+ 树在 MySQL InnoDB 中的具体实现聚簇索引 (Clustered Index):表数据按照主键顺序物理存储在 B+ 树的叶子节点中。...查找过程需要两次 B+ 树搜索:在辅助索引 B+ 树中找到主键值。用该主键值在聚簇索引 B+ 树中查找完整的行数据(回表)。...理解 MySQL 索引的 B+ 树实现,对于设计高效的表结构、编写高性能 SQL 查询、以及进行数据库调优至关重要。

    1.6K20

    MySQL 的B+树索引.

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

    1.4K20

    MySQL的查询需要遍历几次B+树,理论上需要几次磁盘IO?

    最近刚好研究了这块的一些东西,就有种恍然大悟的感觉,这里分享给大家,欢迎拍砖~ 二、遍历B+树的次数 首先,既然问题是一次查询,那我们肯定是要知道mysql使用的存储引擎是哪个,要根据存储引擎的不同判断索引的结构...2、分别遍历了几次B+树 主键索引从上至下遍历一次B+树,直到找到具体的主键,拿到叶子结点存储的数据。 二级索引需要遍历两次B+树,第一次遍历是找到对应的主键,第二次遍历是根据主键找到具体的数据。...比如查询二级索引的sql,先通过遍历二级索引的B+树来找到对应的主键,然后回表即通过主键遍历聚集索引B+树,拿到具体的数据。...3、回表的概念 回表就是通过辅助索引拿到主键id之后,要再去遍历聚集索引的B+树,这个过程就叫做回表。...(3) 但是对于数据库来说,存储场景会更加复杂,二叉树的性能虽然好,但我们还是想要树的高度更低一些,存储的数据更多一些。因此mysql引入了B+树的概念。

    2.8K50

    多叉树 & B树 & B+树 & B*树

    (2). 2-3-4树: 和2-3树的区别就是,它还允许节点有三个元素且有四个子节点。 4. B树: B是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+树的基础上,在非根非叶子节点之间增加了指向兄弟节点的指针。

    2.1K20

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

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

    2.2K30

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

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

    1.7K10

    B树和B+树对比,为什么MySQL数据库索引选择使用B+树?

    一 基础知识 二叉树 根节点,第一层的节点 叶子节点,没有子节点的节点。 非叶子节点,有子节点的节点,根节点也是非叶子节点。...B树 B树的节点为关键字和相应的数据(索引等) B+树 B+树是B树的一个变形,非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中, B+树的叶子节点为链表,链表放数据,非叶子节点是索引。...二 对比 1.B树和B+树同样适用于高度越低,查询越快。 2.B树查找节点,B+树只需要查询所有节点(索引),B树查询索引和数据。...虽然可能第一个就找到,但在极端情况下,需要全查询索引和数据,不如B+树稳定。 3.B+树和B树比,B+树的硬盘空间更少,io的读写代价更低。因为B+树节点只有索引,占位更少。

    1.2K20
    领券