百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

mysql索引总结(二) mysql里面的索引

xsobi 2024-12-30 07:47 16 浏览

1、B-Tree数据结构实现索引优缺点

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5个指针;

知识小贴士: 树的度数指的是一个节点的子节点个数。

https://www.cs.usfca.edu/~galles/visualization/BTree.html:这是一个数据结构可视化网站,里面可以动态演示数据结构的变化情况;

1.1、B-Tree的特点:

  • 5阶的B树,每一个节点最多存储4个key,对应5个指针。
  • 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
  • 在B树中,非叶子节点和叶子节点都会存放数据。

1.2、为什么不使用B-Tree作为索引的数据结构?

在B-Tree中有一个很重要的点就是,非叶子节点和叶子节点都会存放数据。而非叶子节点和叶子节点都是存放在页里面的,页的大小是固定的16k,所以如果将数据和节点放在一起,那么数据会占用大量的空间,导致每个页的节点的数量减少。每个页里面节点的数量少了就会导致整个索引的层级更多,层级多了就会增加检索的次数,检索的次数多了就会降低查询的速度,导致性能降低。所以索引没有使用B-Tree;


2、接下来就是我们索引使用的数据结构了B+Tree

B+Tree是B-Tree的变种,我们以一颗最大度数(max-degree)为4(4阶)的b+tree为例,来看一下其结构示意图:

我们可以看到,两部分:

  • 蓝色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
  • 绿色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。

2.1、B+Tree 与 B-Tree相比,主要有以下三点区别:

  • 所有的数据都会出现在叶子节点。
  • 叶子节点形成一个单向链表。
  • 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。

2.2、上述我们所看到的结构是标准的B+Tree的数据结构,接下来,我们再来看看MySQL中优化之后的B+Tree。

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序。


3、使用hash数据结构作为索引

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。

如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

3.1、特点

  • Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,...)
  • 无法利用索引完成排序操作
  • 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引;

4、下面我们通过常见的面试题,再次回顾一下索引的数据结构

4.1、为什么InnoDB存储引擎选择使用B+tree索引结构?

A. 相对于二叉树,层级更少,搜索效率高;

B. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;

C. 相对Hash索引,B+tree支持范围匹配及排序操作;

相关推荐

Java的枚举类型用法介绍

1背景在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用publicfinalstatic方法定义的代码如下,分别用1表示春天,2表示夏...

讲解一下java枚举(enum)以及使用方法

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。...

C#-枚举定义与使用 052

枚举是一个特殊类,通过反编译工具可以看到其与类的格式一样,枚举值就是常量(不可改变的量)我们学习的枚举值是基于整形的(还有基于其他类型的),就是说在系统中枚举是以整形存在,而我们看到的字符是为了更易于...

小学奥数008 枚举法 巧数三角形

小学奥数008:枚举法数三角形。用枚举法数三角形。·第一题:三角形是由三条线段构成的,其中的两条线段就是这5条线段,从中选出来两条。第三条线段也就是最下面这条线段,从中选出来两个点,一连就是一个线段。...

Python枚举(Enum)技巧,你值得了解

...

Qt C++ 枚举类型的全面解析与最佳实践

I.引言枚举(Enumeration)是C++中一种重要且常用的用户自定义数据类型,它允许开发者为一组整数常量赋予具有描述性的名称,从而提高代码的可读性和可维护性。在QtC++开发环境中...

Java中的枚举类型及其高级用法

Java中的枚举类型及其高级用法大家好,今天咱们来聊聊Java中的枚举类型(enum)。这可是Java世界里一个非常实用且有趣的特性,它从Java5开始就被引入了。如果你正在寻找一种既安全又方便的方...

界面设计方案之 (1) 枚举字典如何设计

下面这篇文章是笔者讲述的关于在业界设计中,枚举字典设计说明等的相关内容,想要了解的同学可以了解一下哦!一、应用场景:为何需要枚举字典?所谓枚举就是能够明确列出有限个具体取值的东西,在具体场景中,例如事...

从零开始学习C语言丨枚举类型的定义和使用

之前学习数据类型的时候,将枚举类型归类于构造数据类型。但在学习枚举的过程中,有的人却说枚举是属于基本数据类型,一时间分不清孰对孰错。不过,类型归属问题不是重点。重点是要知道枚举是什么东西,怎么使用。下...

Python基础:枚举,都有哪些特点和使用场景呢?

在Python编程语言中,枚举(Enumeration)是一种特殊的类,用于为一组常量创建一个名称空间。枚举类在Python3.4中被引入,提供了一种更加直观和方便的方式来处理一组相关的常量。枚举类...

大话C语言:枚举

C语言中,枚举(enumeration)是一种用户定义的类型,它包含一组命名的整数值。枚举类型用于表示固定数量的可能值,并为这些值提供易于记忆和有意义的名称。...

Python中的枚举类型(Enum)详解:从基础到实战

Python的enum模块提供了对枚举类型(Enum)的支持,它可以帮助开发者以类型安全的方式表示一组固定值。本文将从基础用法到高级技巧,详细讲解如何在Python中使用枚举类型。一、为什么需要枚举类...

枚举(Enum)

需求usingSystem;public...

刘心向学(12)枚举类型的定义及其应用

分享兴趣,传播快乐,...

金光闪闪耀人眼:MONSTER 魔声 24K香槟金版 BackFloat蓝牙音箱 开售 30326日元

自从早前与Beats分手,MONSTER(魔声)就在音频设备圈内沉寂了下来,不过今年夏天其终于再次奋作,一口气接连发布多款音频设备,大到家庭音箱,小到入耳式无线耳机,仿佛是要把前些阵子逝去的时间都弥补...