Mysql深度解析(一)索引底层数据结构与算法

news/2024/4/20 6:04:13/文章来源:https://blog.csdn.net/fjd7474/article/details/127622074

MySQL底层索引是用B+树实现的
传送门:什么是B-树、B+树、B*树

传送门:深入理解MySQL索引底层数据结构与算法

传送门:MySQL中Innodb的索引

1 索引是什么?

索引:帮助Mysql高效获取数据的排好序数据结构

2 Mysql索引为什么用B+树而不是用B树?

首先需要知道B树和B+树的区别:
(1)B+树非叶子节点不存储data,只存储索引(冗余),叶子节点包含所有索引字段。而B树所有节点都存放data和索引。
(2)B+树叶子节点用指针连接,而B树没有。

所以Mysql索引用B+树的原因就是:
(1)B+树叶节点使用指针相连,提高了区间访问速度,支持范围查找。
(2)B+树非叶节点不存放数据,只存放索引,所以相同数据量的情况下B+树更加矮胖,所以每次I/O操作可以读取更多的节点数量,当找到目标数据的时候,再通过节点中的数据地址信息去读取数据,可以在总体上减少I/O操作,体检查询效率。

补充:Mysql文件页大小默认16KB
查看mysql文件页大小(16K):SHOW GLOBAL STATUS like 'Innodb_page_size’;

假设我们一行数据大小为1K,那么一页就能存16条数据,也就是一个叶子节点能存16条数据;再看非叶子节点,假设主键ID为bigint类型,那么长度为8B,指针大小在Innodb源码中为6B,一共就是14B,那么一页里就可以存储16K/14=1170个(主键+指针)
那么一颗高度为2的B+树能存储的数据为:117016=18720条,一颗高度为3的B+树能存储的数据为:11701170*16=21902400(千万级条)

(3)B+树结构的检索性能更具有稳定性,B-在找到节点的时候,其实就是已经拿到了需要的数据,而B+树在找到节点之后,还需要再次I/O操作去读取数据,B-最快的时候1次I/O操作就能拿到数据,而B+树每次都需要遍历到叶子节点才能拿到数据,相对来说,B+树结构的检索性能更具有稳定性。

3 MyISAM存储引擎和InnoDB存储引擎索引区别

3.1 MyISAM存储引擎

MyISAM索引文件和数据文件是分离的(非聚集), 叶节点的data域存放的是数据记录的地址

在这里插入图片描述

在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别

只是主索引要求key是唯一的

而辅助索引的key可以重复

如果我们在Col2上建立一个辅助索引,则此索引的结构

跟主键索引的结构没什么区别
在这里插入图片描述

3.2 InnoDB存储引擎

InnoDB引擎索引的关键字和数据都在叶节点上。

可以分为聚集索引与非聚集索引,这两种索引都是使用B+树组织的。

聚集索引:叶节点包含了完整行数据

当我们基于 InnoDB 引擎创建一张表的时候,都会创建一个聚集索引,每张表都有唯一的聚集索引:

  • 如果这张表定义了主键索引,那么这个主键索引就作为聚集索引。
  • 如果这张表没有定义主键索引,那么该表的第一个唯一非空索引作为聚集索引。
  • 如果这张表也没有唯一非空索引,那么 InnoDB 内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个 6 个字节的列,该列的值会随着数据的插入自增。

主键索引和聚集索引并不是一回事

聚集索引最主要的优势就是查询快。如果要查询完整的数据行,使用非聚集索引往往需要回表才能实现,而使用聚集索引则能一步到位。

聚集索引也有一些劣势:

  • 聚集索引可以减少磁盘 IO 的次数,这在传统的机械硬盘中是很有优势的,不过要是固态硬盘或者内存(有时候为了提高操作效率,数据库服务器会整一个比较大的内存),这个优势就不明显了。
  • 聚集索引在插入的时候,最好是主键自增,自增主键插入的时候比较快,直接插入即可,不会涉及到叶子节点分裂等问题(不需要挪动其他记录);而其他非自增主键插入的时候,可能要插入到两个已有的数据中间,就有可能导致叶子节点分裂等问题,插入效率低(要挪动其他记录)。如果聚集索引在插入的时候不是自增主键,插入效率就会比较低。

非聚集索引

非聚集索引也称为二级索引或者辅助索引,对于非聚集索引,数据库会有单独的存储空间来存放。非聚集索引在查找的时候要经过两个步骤,例如执行 select * from user where username=‘javaboy’(假设 username 字段是非聚集索引),那么此时需要先搜索 username 这一列索引的 B+Tree,这个 B+Tree 的叶子结点存储的不是完整的数据行,而是主键值,当我们搜索完成后得到主键的值,然后拿着主键值再去搜索主键索引的 B+Tree,就可以获取到一行完整的数据。

所以如果我们在查询中用到了非聚集索引,那么就会搜索两棵 B+Tree,第一次搜索 B+Tree 拿到主键值后再去搜索聚集索引的 B+Tree,这个过程就是所谓的回表。

一张表只能有一个聚集索引,但可以有多个非聚集索引。使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。

4 联合索引

联合索引遵循最左匹配原则,例如建立联合索引(a,b,c),那么能够生效的索引组合为 a,(a,b),(a,b,c)
在这里插入图片描述

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

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

相关文章

Sping的IoC容器和依赖注入

IoC Inversion of Control 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转 Spring实现了IoC的思想,Spring提供了一个容器,称为IoC容器,用…

【CSS】CSS选择器全解指南【CSS基础知识详解】

👨‍💻个人主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSS】 【CSS专栏】已发布文章 📁【CSS基础认知】 本文目录【CSS选择器全解指南】🌙CSS注…

SpringBoot 转发请求至指定页面

1、前言 原先的页面访问地址为:http://127.0.0.1:8888/office/schdule/index/, 重构项目,SpringBoot 项目,前后分离,前端文件放置静态目录(static)下,访问地址:http://12…

计算机毕业设计(附源码)python疫情管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

URP下的OffScreen Particle Render

【博物纳新】专栏是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。随着越来越多的项目使用…

jsp个人评价管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 个人评价管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使…

多模态自编码器从EEG信号预测fNIRS静息态

导读 本研究介绍了一种深度学习架构,用于评估40名癫痫患者的多模态脑电图(EEG)和功能性近红外光谱(fNIRS)记录。长短期记忆网络和卷积神经网络集成在一个多模态序列到序列的自编码器中。训练后的神经网络通过从EEG全谱和特定EEG频段中分层提取深度特征,…

fscan:一键自动化、全方位漏洞扫描的开源工具

https://blog.csdn.net/osfront/article/details/116049846 打开服务器看到了一个软件fscan64,并有运行页面。因为没见过,吓了我一跳,搜索了下是什么,记录下。 简介 fscan 是一个内网综合扫描工具,方便一键自动化、全方位漏洞扫描。 它支持主机存活探测、端口扫描、常见服务…

【Java数据结构】顺序表

我们不过是普通人,只不过在彼此眼中闪闪发光 目录 1.模拟实现顺序表 1.1 顺序的结构 1.2 顺序表的成员属性 1.3 顺序表的构造方法 1.4 顺序表的成员方法 1.4.1 扩容 1.4.2 打印顺序表 1.4.3 尾插 1.4.4 在指定位置插入 1.4.5 判断数组中是否有这个元素…

SSH婴幼儿产品销售系统电商购物系统(含源码+论文+答辩PPT等)

该项目采用技术JSP、strust2、Spring、Hibernate、Tomcat服务器、MySQL数据库 ,项目含有源码、论文、配套开发软件、软件安装教程、项目发布教程 本系统结构如下: 1,游客访问 |–系统首页,查看所有的商品信息和相关的菜单信息 |–…

每日一记:笔记工具使用、计算机基础知识、编程语言认识

1、笔记工具的使用 我现在使用的是typora这个文档工具 markdown语法 常见操作有:标题、代码块、引用、列表等 typora工具的主页面 我们可以编辑内容 做笔记 。。。 标题分类: 和html(超文本标记语言 前端部分一样)分为六级标题…

拉卡拉第三季营收13.45亿:净利8372万 同比降73%

雷递网 雷建平 10月31日拉卡拉支付股份有限公司(证券代码:300773,证券简称:拉卡拉)日前发布财报,财报显示,拉卡拉2022年前三季营收43.55亿元,同比降11.83%;拉卡拉2022年前…

Shell编程从看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)

文章目录Shell字符串单引号双引号拼接字符串获取字符串长度提取子字符串查找子字符串Shell数组定义数组读取数组获取数组的长度Shell注释流程控制if判断case语句for 循环while 循环read 读取控制台输入Shell字符串 字符串是shell编程中最常用最有用的数据类型(除了…

【DDR3 控制器设计】(5)DDR3 的仲裁读写操作设计

写在前面 本系列为 DDR3 控制器设计总结,此系列包含 DDR3 控制器相关设计:认识 MIG、初始化、读写操作、FIFO 接口等。通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等,附上汇总博客直达链接。 【DDR3 控制器设计】系列…

爆破校园网的宽带

前提:学校的手机号前7位相同,宽带密码都是手机号后六位。仅供学习。 准备工作:电脑一台,把校园网的宽带水晶头插在电脑上, 步骤: winR输入Rasphone点击新建,宽带,输入宽带名称&am…

Kubernetes(31):kubeasz单主机模式

前言 有时候,我们只需要k8s集群进行项目测试,能够使用的主机可能只有一台,那么如何构建一台单机的k8s集群? 单机版的k8s集群可以用于本地测试,或者内部测试环境,或者个人电脑上的项目测试。 那么我们可以使…

Html保留空格和换行

效果&#xff1a; 代码&#xff1a; <pre> 这是一段文本这是一段文本这是一段文 本这是一 段文本这是一段文本 </pre>

会话技术(Session、Cookie)详细介绍

会话技术 request&#xff1a;接收请求 接收请求行 接收请求方式&#xff1a;request.getMethod()接收项目路径&#xff1a;request.getContextPath() 接收请求头 request.getHeader(String name) 接收请求参数 中文参数&#xff1a; get方式&#xff1a;不乱码。因为tomcat8.…

NIO Buffer类的重要方法

1 allocate()创建缓冲区 在使用Buffer&#xff08;缓冲区&#xff09;之前&#xff0c;我们首先需要获取Buffer子类的实例对象&#xff0c;并且分配内存空间。为了获取一个Buffer实例对象&#xff0c;这里并不是使用子类的构造器new来创建一个实例对象&#xff0c;而是调用子类…

带你走入C++动态多态的底层

多态按字面的意思就是多种形态&#xff0c;相同的方法调用&#xff0c;但是有不同的实现方式。多态性可以简单地概括为“一个接口&#xff0c;多种方法&#xff0c;实现接口与实现的分离。 C有两种多态形式&#xff1a; 静态多态动态多态而本文主要介绍动态多态的应用。 动态…