【MySQL】深入了解索引的底层逻辑结构

文章目录

  • 主键排序
  • 一. InnoDB的索引结构
    • 1. 单个page
    • 2. 多个page
  • 二. 为什么选择B+树
  • 三. 聚簇索引和非聚簇索引
  • 结束语

主键排序

我们创建一个user表,并乱序插入数据

mysql> create table if not exists user(-> id int primary key,-> age int not null,-> name varchar(16) not null-> );mysql> insert into user (id,age,name )values(3,18,'杨过'),(4,16,'小龙女'),(2,26,'黄蓉'),(5,36,'郭靖'),(1,56,'欧阳锋');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0mysql> select * from user;
+----+-----+-----------+
| id | age | name      |
+----+-----+-----------+
|  1 |  56 | 欧阳锋    |
|  2 |  26 | 黄蓉      |
|  3 |  18 | 杨过      |
|  4 |  16 | 小龙女    |
|  5 |  36 | 郭靖      |
+----+-----+-----------+
5 rows in set (0.00 sec)

我们发现,虽然是乱序插入,但是显示出来却是排好序的。这是MySQL做的吗?让我们带着这个疑问开始本章的学习

一. InnoDB的索引结构

MySQL的基本单位是Page,Page存储着数据,而一个数据表文件因其数据量多少由一个或多个Page构成

1. 单个page

在这里插入图片描述
不同的Page,在MySQL中,都是16KB大小,使用page_prev和page_next互相链接,构成双向链表

上面构建的user表,因为有主键,所以MySQL会默认按照主键对数据进行排序,让Page内的数据是有序且彼此关联的

排序同时也可以提高查询速度
Page内部存放数据,实质是使用了链表,链表是增删快,查询慢,所以需要优化查询效率。
而有序,可以保证每次查询都是有效查询,当前值一定比前面的值大,比后面的值小。

2. 多个page

  • Page的作用是在查询数据时,直接将一整页的数据加载到内存中,以减少IO次数,从而提高性能。但Page内部采用了链表的结构,还是需要线性遍历的,效率太低

MySQL使用页目录进一步提高查询效率


页目录

我们在看一本书时,前几页是整本书的目录,如果我们想查看其中的某一章节,那么就可以根据目录中那一章节的页数,跳跃查找
但存储目录同样需要纸张,所以目录是一种以空间换时间的做法


单页情况

我们在单页Page中加入目录

在这里插入图片描述

通过引入目录,如果我们要查询id=4的数据,之前需要线性遍历4次,但现在可以先通过目录2[3],直接进行定位新的起始位置,提高了效率。

所以,为什么MySQL要自动排序呢?
因为方便引入目录


多页情况

Page的大小为16KB,当数据量不断增大时,势必需要多个Page存储数据
在单表数据不断被插入的情况下,MySQL会在容量不足时,自动开辟新的Page来保存新的数据,使用指针的方式,将所有的Page组织起来

在这里插入图片描述

而当Page越来越多时,Page之间也是使用指针连接,整体是双向链表结构,Page之间仍是线性查询
如何解决呢?其实是一样的,给这些Page也带上目录就好了

  • 使用一个目录来指向某一页,而这个目录项存放的是指向的Page中存放的最小的数据的键值
  • 和Page内目录不同的地方在于,这种目录管理的级别是Page页内目录管理级别是行
  • 其中,每个目录项的构成是:键值+指针(下图没画指针的地址)

在这里插入图片描述
存在一个目录页来管理页目录,目录页中的数据存放的就是指向的那个Page中最小的数据。有数据,就可以通过比较,找到该访问那个Page,进而通过指针,找到下一个Page

目录页的本质也是页,普通页中存放的是用户数据,目录页存放的是普通页的地址

即使数据量变大,页目录变大,我们依然可以再在上方添加管理页目录的页目录来加快检索效率
在这里插入图片描述

这种结构其实就是B+树
此时,随便查找一个id值,查找的Page数减少,意味着IO次数也减少了,那么效率也就提高了

总结一下

  • Page分为目录页数据页,目录页只放各个下级Page的最小键值
  • 查找的时候,自顶向下查找,只需要加载部分目录页到内存中,即可以完成算法的整个查找过程,大大减少了IO次数

二. 为什么选择B+树

  • 链表or线性表
    链表和线性表肯定是不行的,线性查找的效率太低了

  • 二叉搜索树
    二叉搜索树,如果插入的值一直比起始都大或者小,就会出现退化的问题,变成线性结构

  • AVL树&&红黑树
    虽然AVL树是平衡树,红黑树是接近平衡,但是毕竟是二叉结构,相比较多阶B+,意味着树整体过高。都是自顶向下查找,层高越低,意味着查找次数越少,系统与硬盘的IO次数更少

  • Hash
    官方的索引实现中,MySQL是支持Hash的,不过InnoDB和MyISAM并不支持Hase跟进其算法特征,决定了虽然有时候也很快O(1),不过,在面对范围查找就明显不行,另外还有其他差别,有兴趣可以查一下

在这里插入图片描述
图中的BTREE是B+树

  • B树

数据结构演示链接:数据结构可视化

B树
在这里插入图片描述

B+树
在这里插入图片描述

  • B树的节点,既有数据,又有Page指针,而B+树,只有叶子节点有数据,其他目录页只有键值和Page指针

  • B+树的叶子节点是相连的,而B树没有

之所以选择B+树,是因为目录页不存储数据,只存储指针,可以存储更多的key,可以使得树更矮,所以IO次数更少
叶子节点相连,也更便于进行范围查找

三. 聚簇索引和非聚簇索引

先介绍一下MyISAM的存储结构
MyISAM同样使用B+树,但不同的是叶节点的数据存放的是数据记录的地址。
如下图所示:CoI1为主键
在这里插入图片描述

MyISAM最大的特点,是将索引Page和数据Page分离,也就是叶子节点没有数据,只有对应数据的地址

相较于InnoDB索引,InnoDB是将索引和数据放在一起的

用MyISAM为存储引擎创建表会形成三个文件

.frm后缀表示表结构数据
.MYD后缀表示用户数据
.MYI后缀表示主键索引数据

其中,MyISAM这种用户数据与索引数据分离的索引方案,叫做非聚簇索引

用InnoDB为存储引擎创建表会形成两个文件

.from后缀表示表结构数据
.ibd后缀表示主键索引和用户数据

InnoDB这种用户数据与索引数据放在一起的索引方案,叫做聚簇索引

MySQL除了默认会建立主键索引以外,用户也可能按照需求用其他列信息建立索引,一般这种索引叫做普通(辅助)索引

对于MyISAM建立普通索引和主键索引没有什么差别,无非是主键不能重复,而非主键可以重复

下图是基于MyISAM的Col2建立的索引,和主键索引没有差别
MyISAM建立索引,会建立一个新的B+树页目录和叶子结点所存储的指针改变,不会建立新的数据表

在这里插入图片描述

同样,InnoDB除了主键索引,用户也会创建普通索引,以上表的Col3建立普通索引,如下图
在这里插入图片描述
可以看到,InnoDB的非主键索引中叶子节点并没有数据,而只有对应记录的key值,存储的是主键索引的键值

所以通过普通索引,找到目标记录,需要两遍索引
首先检索普通索引获得主键
然后用主键在主键索引中检索获得数据。
这个过程,叫作回表查询

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

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

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

相关文章

嵌入式SoC降低能够有效降低电力线表应用的成本

用于基于FSK的电力线通信(PLC)。MB87S2090和MB87S2090-F与ADD Semiconductor,电力线通信嵌入式SoC的开发商以及用于自动仪表管理的解决方案联合开发。两种器件都与ADD Semiconductor的设计引脚兼容。 MB87S2090是一种电力线通信嵌入式SoC&am…

centos7部署Nginx和RabbitMQ

文章目录 Nginx安装部署【简单】简介安装 RabbitMQ安装部署【简单】简介安装 Nginx安装部署【简单】 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx可以托管用户编写的WEB应用程序成为可访问的网页服务&am…

从零到一完成Midway.js登录、注册、鉴权功能

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ 前言 本文将从项目搭建到实现从零到一开发一个登录、注册、鉴权的简易版注册登录系统,主要功能和技术选型如下: 服务端框架———…

服务安全-应用协议rsync未授权ssh漏洞复现

目录 服务攻防-应用协议rsync&ssh漏洞复现漏洞复现配置不当-未授权访问-rsync文件备份OpenSSH 用户名枚举漏洞libssh身份验证绕过漏洞 服务攻防-应用协议rsync&ssh漏洞复现 漏洞复现 配置不当-未授权访问-rsync文件备份 rsync默认端口:873 rsync是Linux下…

初识华为云数据库GaussDB for openGauss

01 前言 GaussDB是华为自主创新研发的分布式关系型数据库。该产品具备企业级复杂事务混合负载能力,同时支持分布式事务,同城跨AZ部署,数据0丢失,支持1000的扩展能力,PB级海量存储。同时拥有云上高可用,高可…

PyTorch 深度学习之卷积神经网络(高级篇)Advanced CNN(十)

0. Revision 前面讲的比较简单的是 串行网络结构 1. GoogLeNet 1.1 Inception module w h 要一致 what is 11 convolution? 信息融合-eg.高中各门学科成绩比较(总分) 最主要工作:改变通道数量 why is 11 convolution? 减少10倍 1.2 implementation of inception module 拼…

深度学习实战57-pytorch框架搭建LSTM+CNN模型与实现时间序列的预测过程

大家好,我是微学AI,今天给大家介绍一下深度学习实战57-pytorch框架搭建LSTM+CNN模型与实现时间序列的预测过程, 随着科技的进步,我们越来越依赖数据来理解世界,预测未来。特别是在金融、气候研究、交通管理等领域,时间序列预测已经成为了重要的工具。本文将介绍如何使用L…

算法leetcode|84. 柱状图中最大的矩形(rust重拳出击)

文章目录 84. 柱状图中最大的矩形:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 84. 柱状图中最大的矩形: 给定 n 个非负整…

构建高效问题解答平台:使用Cpolar和Tipas在Ubuntu上搭建专属问答网站

文章目录 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道(云端设置)3.3 Cpolar稳定隧道(本地设置) 4. 公网访问测试5. 结语 前…

KubeVela交付

有什么用我也不想说了,这个是k8s CI/CD,进阶玩家玩的了,比你们喜欢Arg CD更科学,更现代 在 Kubernetes 中安装 KubeVela helm repo add kubevela https://charts.kubevela.net/core helm repo update helm install --create-namespace -n v…

pip快速安装torch、opencv、scipy库

目录 一、pip安装torch 1.1 torch介绍 1.2 torch.nn相关库的导入 1.3win10上torch的安装命令 二、pip安装Opencv 三、pip安装scipy库 一、pip安装torch 1.1 torch介绍 torch的基本功能: ①torch:张量的相关运算,例如:创…

ti am335 RT-LINUX测试

RT-Linux是一个基于Linux内核的实时操作系统,它在满足Linux操作系统的通用性的同时兼顾 实时性能,它的核心是Linux内核的一个实时扩展,它为实时任务提供了必要的调度机制和时间管理。通过采用抢占式调度策略,高优先级的实时任务可…

STM32物联网基于ZigBee智能家居控制系统

实践制作DIY- GC0169-ZigBee智能家居 一、功能说明: 基于STM32单片机设计-ZigBee智能家居 二、功能介绍: 1个主机显示板:STM32F103C最小系统ZigBee无线模块OLED显示器 语音识别模块多个按键ESP8266-WIFI模块(仅WIFI版本有&…

Python学习基础笔记七十二——IDE集成开发环境

集成开发环境,英文缩写是IDE。 IDE可以帮你更高效地开发项目代码。因为它提供了非常实用的功能,比如项目文件管理、语法高亮、代码导航、自动补齐代码、语法静态检查、调试、版本控制等等。 两款IDE:Pycharm和VSCode。 pycharm中的代码文件都…

HUAWEI(26)——防火墙双机热备

一、拓扑 二、需求 PC2 ping PC1 FW1与FW2双机热备,FW1为active,FW2为Standby,抢占延时1s VRRP 三、配置 1.IP地址,防火墙接口加入区域 防火墙用户名:admin 防火墙旧密码:Admin@123 防火墙新密码:admin@123 [FW1]interface GigabitEthernet 1/0/0 [FW1-GigabitEthe…

代码随想录Day20 回溯算法 LeetCode77 组合问题

以下内容更详细解释来自于:代码随想录 (programmercarl.com) 1.回溯算法理论基础 回溯法也叫回溯搜索法,是搜索法的一种,我们之前在二叉树中也经常使用到回溯来解决问题,其实有递归就有回溯,有的时候回溯隐藏在递归之下,我们不容易发觉,今天我们来详细介绍一下什么是回溯,它能…

YOLOv5网络结构图

网络结构图(简易版和详细版) 网络框架介绍 前言: YOLOv5是一种基于轻量级卷积神经网络(CNN)的目标检测算法,整体可以分为三个部分, backbone,neck,head。 如上图所示…

netca_crypto.dll找不到怎么修复?详细解决办法和注意事项

当你在使用计算机时,突然出现了一个错误提示:“netca_crypto.dll 找不到”。不知道该如何解决这个问题?其实要解决是非常的简单的,今天我们将为你提供几种修复 netca_crypto.dll 找不到的解决方法和一些注意事项。在深入探讨修复方…

ARM day9

src/key_it.c #include "key_it.h" #include "led.h" void key_it_config() {//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR | (0x1<<5);//设置PF9 PF7 PF8GPIO输入//PF9GPIOF->MODER & (~(0x3<<18));//PF8GPIOF->MODER & (~(0x3&l…

进来“抄作业”!示例代码、操作手册,尽在华为云Codelabs!

1 Codelabs 简介 1.1 什么是 Codelabs&#xff1f; Codelabs 是华为云开发者工具&#xff0c;提供互动式的&#xff0c;以实践为主的教程&#xff0c;这些教程旨在指导开发者通过实际操作来学习新的编程技能、工具、框架。华为云 Codelabs 提供丰富的华为云产品代码示例/操…