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条线段,从中选出来两条。第三条线段也就是最下面这条线段,从中选出来两个点,一连就是一个线段。...
- 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(魔声)就在音频设备圈内沉寂了下来,不过今年夏天其终于再次奋作,一口气接连发布多款音频设备,大到家庭音箱,小到入耳式无线耳机,仿佛是要把前些阵子逝去的时间都弥补...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- characterencodingfilter (33)
- getmonth (34)
- label换行 (33)
- android studio 3 0 (34)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- xmlhttp (35)
- mysql更改密码 (34)
- 权限777 (33)
- htmlposition (33)
- 学校网站模板 (34)
- textarea换行 (34)
- 轮播 (34)
- asp net三层架构 (38)
- bash (34)