数据结构——树的相关概念和MySQL索引

Posted 馥钰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——树的相关概念和MySQL索引相关的知识,希望对你有一定的参考价值。

https://www.cnblogs.com/ssskkk/p/12214436.html#_label2

回到顶部

平衡二叉树和二叉查找树

至多有两个子节点的树成为二叉树

1)平衡二叉树

1)树的左右高度差不能超过1.

2)任何往下递归的左子树和右子树,必须符合第一条性质

3)没有任何节点的空树或只有跟节点的树也是平衡二叉树

树的节点Node是key value的形式。因为key可能不连续,甚至不是整数,所以我们没办法使用数组来表示,这个时候我们就可以用二叉查找树来实现

2)二叉查找树

树如其名,二叉查找树非常擅长数据查找。

二叉查找树额外增加了如下要求:它的左子树上所有节点的值都小于它,而它的右子树上所有节点的值都大于它。

查找的过程从树的根节点开始,沿着简单的判断向下走,小于节点值的往左边走,大于节点值的往右边走,直到找到目标数据或者到达叶子节点还未找到。

通常设计Node节点来表示key value这样的数据对

二叉查找树的insert

 View Code

二叉查找树的search

 View Code

二叉查找树的遍历

前序遍历:先访问当前节点,再依次递归访问左右子树

中序遍历:先递归访问左子树,再访问自身,再访问右子树

后序遍历:先递归访问左右子树,再访问自身节点

 View Code

二叉查找树的局限性:

如果数据近乎有序:比如1 2 3 4 5 6组成的二叉搜索树退化成了一个链表

解决办法:改造二叉树的实现——>平衡二叉树

回到顶部

AVL树和红黑树

3)AVL树

AVL树是一种平衡二叉查找树 左右子树树高不超过1,增加和删除节点后通过树形旋转重新达到平衡

右旋是以某个节点为中心,将他沉入当前右子节点的位置,而让当前的左子节点作为新树的跟节点

同理,左旋是以某个节点为中心,将它沉入当前左子节点的位置,而让当前右子节点作为新树的根节点

4)红黑树(红黑树本身在树里面是排好顺序的,自身有一些平衡性的操作,所以查找的时候性能比较高)

红黑树和AVL树类似,都是在进行插入和删除元素时,通过特定的旋转来保持自身平衡的,从而获得较高的查找性能。

与AVL树相比红黑树并不追求所有递归子树的高度差不超过1,而是保证从根节点到叶子节点的最长路径不超过最短路径的2倍。

它额外引入了5个约束条件

1)节点只能是红色或黑色

2)根节点必须为黑色

3)所有NIL节点都是黑色的。NIL,即叶子节点下挂的两个虚节点

4)一条路径上不能出现相邻的两个红色节点。

5)在任何递归子树内,根节点到叶子节点的所有路径上包含相同数目的黑色节点。

由于红黑树也是二叉查找树,它们当中每一个节点的比较值都必须大于或等于在它的左子树中的所有节点,并且小于或等于在它的右子树中的所有节点。这确保红黑树运作时能够快速的在树中查找给定的值。

总结一下,即"有红必有黑,红红不相连",上述五个约束条件保证了红黑树的新增、删除、查找的最坏时间复杂度均为O(log n)

5)红黑树与AVL树的比较

https://www.cnblogs.com/ajianbeyourself/p/11173851.html

6)TreeMap

基于红黑树实现的TreeMap提供了平均和最坏复杂度均为O(logn)的增删改查操作,并且实现了NavigableMap接口,该集合最大的特点是key的有序性

7)完全二叉树——>二叉堆

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

回到顶部

B树和B+树

B 树可以理解为一个节点可以拥有多于 2 个子节点的多叉查找树

与平衡二叉树相比,B 树利用多个分支(平衡二叉树只有两个分支)节点,减少获取记录时所经历的节点数。

B 树中同一键值不会出现多次,要么在叶子节点,要么在内节点上。

比如用 1、2、3、5、6、7、9 这些数字构建一个 B 树结构,其图形如下:

B 树也是有缺点的,因为每个节点都包含 key 值和 data 值,因此如果 data 比较大时,每一页存储的 key 会比较少;当数据比较多时,同样会有:“要经历多层节点才能查询在叶子节点的数据” 的问题。这时,B+ 树站了出来。

B+ 树是 B 树的变体,定义基本与 B 树一致,与 B 树的不同点:

  • 所有数据都在叶子节点
  • 各叶子节点用指针进行连接
  • 非叶子节点上只存储 key(索引值) 的信息,这样相对 B 树,可以增加每一页中存储 key 的数量。
  • B 树是纵向扩展,最终变成一个 “瘦高个”,而 B+ 树是横向扩展的,最终会变成一个 “矮胖子”

还是根据前面提到的这组数字(1、2、3、5、6、7、9)举例,它的结构如下:

与  B 树的结构最大的区别就是:

它的键一定会出现在叶子节点上,同时也有可能在非叶子节点中重复出现。而 B 树中同一键值不会出现多次。

B树和B+树的区别

data是索引元素对应磁盘文件地址的指针/索引锁住那一行的其他字段的数据

mysql B+ Tree索引和Hash索引的区别

https://blog.csdn.net/why_still_confused/article/details/85129376

注:
1.哈希索引数据并不是按照索引列的值顺序存储的,故无法用于排序
2.哈希索引只支持等值比较查询,如:=、in()、<=>(安全比较运算符,用来做 NULL 值的关系运算),不支持任何范围查询

3.哈希碰撞

回到顶部

MySQL为什么用自增主键做索引

有面试题会问 为什么不用uuid做索引

1.uuid占用空间大

2.uuid含有字符串 比较大小的速度不如int类型

3.插入一条数据的时候,uuid不是自增,新插入的数据可能在原来的节点之间,为了维持B+树的特征 MySQL会进行一次节点分裂(页分裂)操作 从而浪费时间

回到顶部

innodb和myslam索引区别

InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(data是索引锁住那一行的其他字段的数据)。必须要有主键,通过主键索引效率很高。

MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,(data是索引元素对应磁盘文件地址的指针)。

参考文章CSDN:innodb和myslam区别

主键索引:data是索引锁住那一行的其他字段的数据/data是索引元素对应磁盘文件地址的指针

辅助索引:data存的是主键

MySQL中myisam和innodb的主键索引有什么区别? 

突然想到一个问题,MySQL不采用Hash索引的原因是因为Hash索引无顺序,为什么不让Hash值有序呢???就像B+树的最后一层一样——>hash值得到的索引是随机的

以上是关于数据结构——树的相关概念和MySQL索引的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:索引与事物

如何设计性能优良的mysql索引?

如何设计性能优良的mysql索引?

mysql概念

MySQL 索引结构

MySQL 索引结构