MySQL--索引底层数据结构详解

索引是什么?

索引是帮助MySQL高效获取数据的排好序的数据结构,因此可知索引是数据结构。
概念很抽象,但是类比生活中的例子就很容易理解,比如一本厚厚的书,我们想取找某一小节,我们可以根据目录去快速找到对应的章节,其实这个目录就可以叫这本书的索引,而数的目录又分为大章节小章节,如果倒着看是不是很像一棵树呢?

常见树的数据结构及特点:

二叉树:
二叉树是每个节点最多有两个子节点的树结构,通常有左子树和右子树,左右子树是有顺序的,左子树的值要小于父节点,右子树的值要大于父节点。

二叉树示意图:
在这里插入图片描述

极端情况下二插树可能没有左右子树,比如一组递增的数据,最终就形成了一个链表。

极端情况下二叉树示意图:
在这里插入图片描述

为了避免这种情况的发生,产生了平衡二叉树。

平衡二叉树(AVL Tree):
平衡二叉树是一种特殊的二叉树,除了满足二叉树的特征之外,它还要求左右两颗子树的高度差的绝对值不能超过1,且左右两棵子树都是平衡二叉树。
平衡二叉树解决了极端情况下退化为链表的问题,但是平衡二叉树满足了每个节点最多两个子节点的特点,如果数据量比较大的情况下,二叉树的高度会非常,查询的时候会多次进行磁盘IO,查询的性能会比较差,因此诞生了B-Tree。

同样数据,使用平衡二叉树演示:
在这里插入图片描述
很明显同样数据AVL树没有出现二叉树的情况。

B-Tree的特点:

  • 度(Degree):节点存储数据的个数,B-Tree允许一个节点存储多个数据。
  • 每个节点可以有M个子节点。
  • 叶子节点具有相同的深度。
  • 节点的数据从左到右顺序排列。
  • 叶子节点指针为空。

同样数据,B-Tree演示:

在这里插入图片描述

B+Tree的特点:

  • 非叶子节点不存储数据,只存储索引key,可以增加度(key占用的空间远小于data占用的空间)。
  • 叶子节点存储了全部数据,且增加了顺序访问指针,提高了区间访问性能,支持范围查询。

InnoDB中存储引擎页大小是16KB,一个节点就是一页,而一个Long类型的主键id占用8个字节,故叶子节点如果只存储索引的话,一个节点就能存储大量的索引key,这样就大大减少了节点个数,同时也节省了存储空间。

同样数据,B+Tree演示:

在这里插入图片描述
很直观的看到,B+Tree叶子节点多了指针,且叶子节点有全部数据,数据从左到右依次增大。

好用的数据演示网站:

在这里插入图片描述

Hash索引的特点:

  • hash索引不支持范围查找。
  • hash存在哈希冲突问题。
  • hash索引经过一次查询就可以定位到数据,查询效率比B+Tree高。

Full-text全文索引的特点:

仅可用于 MyISAM 存储引擎,用于检索文本信息的, 针对较大的数据,生成全文索引很耗时间及空间,在MySQL中一般不常用。

聚集索引和非聚集索引?
聚集索引和非聚集索引是按物理存储结构来划分的一个概念。

  • 聚集索引也叫聚族索引,是以主键创建的索引,聚集索引叶子节点存储的是数据,一个表中只存在一个聚集索引,且只存在于InnoDB引擎中。
  • 非聚集索引也叫辅助索引,索引和数据不在一起,非聚集索引叶子节点存储的是索引对应数据行的主键,通过索引行找到主键后,根据主键去找对应的数据。

MySQL InnoDB、MyISAM、Memory存储引擎对索引数据结构的支持:

数据类型InnoDBMyISAMMemory
B+Tree支持支持支持
Hash不支持(用户无法手动创建Hash索引)不支持支持
Full-text5.6版本后支持支持不支持

如有不正确的地方请各位指出纠正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现快速排序算法

Python实现快速排序算法 下面是使用 Python 实现的快速排序算法的示例代码&#xff1a; def quick_sort(arr):if len(arr) < 1:return arrelse:pivot arr[0]less_than_pivot [x for x in arr[1:] if x < pivot]greater_than_pivot [x for x in arr[1:] if x > pi…

Spring Boot中Excel数据导入导出的高效实现

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

基于SpringBoot+MYSQL的大学生租房平台

目录 1、 前言介绍 2、主要技术 3、系统流程 3.1、操作流程 3.2、登录流程 3.3、删除信息流程 3.4、添加信息流程 4、功能需求 5、系统设计 5.1、功能结构设计 5.1、数据库概念设计 6、运行截图(部分) 6.1、管理员功能实现 6.1.1、房东管理 6.1.2、信息审批管理 …

Redis 配置文件详解

Units 单位 配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感。 # Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with …

聚观早报 | 腾讯QQ测试AI对话功能;哪吒L官宣4月交付

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月8日消息 腾讯QQ测试AI对话功能 哪吒L官宣4月交付 中国对瑞士等6国试行免签 Redmi K70至尊版细节曝光 Meta正…

IDEA自定义Maven仓库

Maven 是一款广泛应用于 Java 开发的工具&#xff0c;其作用类似于一个全自动的 JAR 包管理器&#xff0c;能够方便地导入开发所需的相关 JAR 包。在使用 Maven 进行 Java 程序开发时&#xff0c;开发者能够极大地提高开发效率。以下是关于如何安装 Maven 以及在 IDEA 中配置自…

基于LSTM实现春联上联对下联

按照阿光的项目做出了学习笔记&#xff0c;pytorch深度学习实战项目100例 基于LSTM实现春联上联对下联 基于LSTM&#xff08;长短期记忆网络&#xff09;实现春联上联对下联是一种有趣且具有挑战性的任务&#xff0c;它涉及到自然语言处理&#xff08;NLP&#xff09;中的序列…

【Jemter】安装

1.准备前提工作 2.安装和卸载jdk 1&#xff09;安装双击jdk 2&#xff09;添加环境变量 此电脑–属性–高级系统设置–环境变量–系统变量–path删除/新建 C:\Program Files\Java\jdk-1.8\bin C:\Program Files\Java\jdk-1.8\jre 3&#xff09;验证 以防万一要卸载&#xff…

基于yolov5的铁轨缺陷检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的铁轨缺陷检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的铁轨缺陷检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目…

Vue 使用Element Plus

1.官网安装 | Element PlusA Vue 3 based component library for designers and developershttps://element-plus.gitee.io/zh-CN/guide/installation.html#%E4%BD%BF%E7%94%A8%E5%8C%85%E7%AE%A1%E7%90%86%E5%99%A8 npm install element-plus --save2. 全局安装图标 npm ins…

连接kafka报错:java.io.IOException: Can‘t resolve address:

修改电脑host文件:C:\Windows\System32\drivers\etc\hosts 加上一行 192.168.1.XXX MHA_SLAVE2&#xff08;192.168.1.XXX 这个是安装kafka 的服务器地址&#xff0c;MHA_SLAVE2是kafka的容器id&#xff09;

构建可视化工具选择策略

更多的信息总是意味着更好的结果吗&#xff1f;这完全取决于项目所处的环境。 以烘焙为例。当你做蛋糕时&#xff0c;你的原材料经历了许多化学变化和烹制过程。如果任何一个环节出现问题&#xff0c;蛋糕就做不好。但这并不意味着你需要理解食材在分子级别上发生了什么&#…

科技云报道:阿里云降价,京东云跟进,谁能打赢云计算价格战?

科技云报道原创。 就在大家还在回味2月29日阿里云发布“史上最大降价”的惊喜时&#xff0c;京东云连夜发布降价消息&#xff0c;成为第一家跟进的云服务商&#xff0c;其“随便降&#xff0c;比到底&#xff01;”的口号&#xff0c;颇有对垒的意味&#xff0c;直接吹响了云计…

retinaNet FocalLoss源码详解

targets[positive_indices, assigned_annotations[positive_indices, 4].long()] 1 ## 把正样本所对应的锚框所对应的类别的列置为1 # aim torch.randint(0, 1, (1, 80)) # tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # 0…

react tab选项卡吸顶实现

react tab选项卡吸顶实现&#xff0c;直接上代码&#xff08;代码有注释&#xff09; tsx代码 /* eslint-disable react-hooks/exhaustive-deps */ import React, { useEffect, useState } from "react"; import DocumentTitle from react-document-title import s…

智奇科技工业 Linux 屏更新开机logo

智奇科技工业 Linux 屏更新开机logo 简介制作logo.img文件1、转换格式得到logo.bmp2、使用Linux命令生成img文件 制作rootfs.img文件替换rootfs.img中的logo 生成update.img固件附件 简介 智奇科技的 Linux 屏刷开机logo必须刷img镜像文件&#xff0c;比较复杂。 制作logo.i…

Python教程,python从入门到精通 第1天 温习笔记

1.1 字面量 1.2 注释 1.3 变量 1.4 数据类型 1.5 数据类型转换 1.6 标识符 1.7 运算符 1.8 字符串的三种定义方式 1.9 字符串拼接 1.10 字符串格式化 1.11 掌握格式化字符串的过程中做数字的精度控制 1.12 掌握快速字符串格式化的方式 1.13 字符串格式化&#xff0d;表达式的格…

《MySQL实战45讲》课程大纲

1MySQL实战45讲-01基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f;2MySQL实战45讲-02日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f;3MySQL实战45讲-03事务隔离&#xff1a;为什么你改了我还看不见&#xff1f;4MySQL实战45讲-04深入浅出索引&…

【C++干货基地】六大默认成员函数: This指针 | 构造函数 | 析构函数

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

Redis冲冲冲——redis数据类型及对应的数据结构

目录 引出redis数据类型及对应的数据结构Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户…