mysql InnoDB 索引结构

news2024/11/18 5:42:08

目录

前言

1. InnoDB常见的索引

2. B+树索引

2.1 二分查找法

2.2 二叉查找树

2.3 平衡二叉树

2.4 B树索引

2.5 B+树索引

2.5.1 聚集索引

2.5.2 非聚集索引

2.5.3 聚集索引与非聚集索引区别


前言

        索引的本质是让mysql以最高效、扫描行数最少的方式找到需要的数据。索引作用很大,但是也不索引越多,查询性能就越高。同样索引太少,也不行。所以如何给应用程序创建合适的索引至关重要。我认为最好的方式,是根据业务发展的需要,可以动态的对创建索引进行调整。如业务初期数据量不多的时候,可以先不建索引,待业务增速比较快的时候,对查询的需求增多的时候,可以根据具体的业务场景的数据流进行创建或者调整。当然,如果可以提交预判业务上的查询需求,可以在初期的时候把索引创建好。创建合适的索引也是非常有技术含量的。

1. InnoDB常见的索引

        B+树索引、全文索引、哈希索引

2. B+树索引

        B+树索引的结构类似于二叉树,可以根据键值快速的找到数据。这里需要注意的是,B+树索引实际找到并不是具体的行,而被查找数据行所在的页,然后把页读取到内存中,再在内存中查询与查询条件匹配的数据,最后返回。为了更好的理解B+树的结构和算法,先熟悉一下与B+树结构类似的二叉树和二分查询法

2.1 二分查找法

        二分查找法的基本思想是:

        1、将记录按有序化(升序或降序)排列;

        2、以排好序列的中点位置为比较对象,如果要查找的元素小于该中点元素,则待查找的序列范围可以缩小到左半部分,否则为右半部分。

        3、通过一次比较,查找范围可以缩小一半,以此类推,直到找到结果。

2.2 二叉查找树

二叉树规则:左子树的键值总是小于根节点的键值,右子树的键值总是大于根节点的键值。

        二叉树的定义规则比较简单,查询的思想就是二分查找法,有些情况下查找效率比较高,如图下:树的高度比较平衡、低,有些情况下会变成顺序查找,效率就不高了,如图二:根限情况下,二叉查找树变成了一个单向链表了。

2.3 平衡二叉树

        为了解决二叉查找树在某些情况下查找效率低的问题,平衡二叉树出现了。平衡二叉树的定义规则除了要满足基本二叉树的定义规则外,还必须满足任何节点的两个子树的高度最大差为1。上图一,是满足平衡二叉树的定义,图二就不满足。平衡二叉树的查找速度的确很快,不过维护平衡二叉树的代价也是比较大的,即当树增加或减少节点的时候,需要通过左旋或右旋操作,来调整树的树结构,使其继续保持平衡。

2.4 B树索引

        mysql的InnoDB存储引擎早期的索引结构是B树,其本质就是平衡二叉树。

        上一篇文章已经分享过msyql的InnoDB存储引擎的逻辑存储结构分别是由表空间、段、区、页、行组成,页是InnoDB存储引擎磁盘管理的最小单位。B树索引的结构如下图,节点的基本单位是页,叶子节点中存入的行数据,非叶子节点存储的是索引键和指针,根节点、非叶子节点、叶子节点之间以指针相连。

        假如我要查找id=33的王小红,那么其查询流程是这样的:

        1、先找到根节点,也就是页1,这里特别说明一下,mysql的B树索引的根节点一般会提前缓存到内存中,比较发现33小于60,那么根据页1中的指针p1找到了页2;

        2、找到页2后,与页2中的键值比较后,发现33在30与50之间,那么根据页2中的指针p2找到页6;

        3、页6已经是叶子节点了,把页6中数据读取到内存中,然后匹配到id=33的王小红,最后返回。

2.5 B+树索引

        B+树的实质是B树的进一步优化,再来看一下B+树的结构图:

        与B树不的点:

        1、非叶子节点是不存储数据的,仅存键值,B树的非叶子节点不仅有键值,还会存储数据。

        2、叶子节点与非叶子节点之间通过双向链表相连。

        小结一下,我们可以得到一个结论:

        1、B树和B+树索引的根节点是缓存到内存中,每向下查找一次都要进行一次磁盘读取 ,那如果树的高度越低,读取磁盘的次数就越少,查询性能就越高。

        2、B树和B+树索引的结构是平衡二叉树,为了保持树的平衡性,每次对表的增、删、改操作都需要对索引结构进行分裂调整,如果索引列建的很多,那么分裂调整索引占用的资源就越多,数据库的整体性能就会下降,这下明白为啥索引不一定越多越好了吧。

        3、页是mysql的InnoDB存储引擎最小的磁盘管理单位,其大小是固定的,默认是16k,如果有限的页空间里存储是键值,而不是数据,那么页中就会存储更大键值范围,那么树的高度就会更低,读取磁盘的次数更少,查询性能也就更高,所以B+树索引要优于B树。

        4、B+树的叶子节点存储的是数据,且叶子节点之间是双向链表相连,数据内部是单向链表,那么B+树索引的列在范围查询、排序更有优势。(索引从结构上分有B+树索引、全文索引、哈希索引,使用的时候应该根据实际场景选择,而不是瞎建。)

2.5.1 聚集索引

        其实B+树还可以细分,表按主键构造一颗B+树索引,那这样的索引就称为聚集索引。通常情况下,每张表都会建一个自增主键,那么这个id就是键值,叶子节点上与键值相对应的就是数据行。

2.5.2 非聚集索引

        按非主键列构建的B+树索引,就是非聚集索引。

2.5.3 聚集索引与非聚集索引区别

        1、根本区别在于聚集索引的叶子节点存储有键值和数据行,非聚集索引的叶子节点存储的是键值和指向聚集索引的指针。

        2、通过聚集索引查询数据的时候,在叶子节点匹配到数据后就可以直接返回了;通过非聚集索引列查询数据的时候,在叶子节点匹配到的不是数据行,而是指向聚集索引的指标,所以需要再根据指针再去取实际的数据,通常这个动作叫回表查询。(现在明白为啥有人反复说,表一定要有一个主键了吧)

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

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

相关文章

Paper写作怎么了解题目方面的重要性?

我们常听到:Paper的好坏,从选择题目开始!可见选择Paper题目的重要性。这正是我们今天要探讨的内容。 We often hear that the quality of paper starts from choosing the topic!This shows the importance of selecting paper topics.This i…

数字信号处理-9-离散余弦变换

1 波形合成 假定给一系列振幅和一系列频率,要求构建一个信号,此信号是这些频率元素的和。这样的操作就是合成 def synthesize(amps, fs, ts):"""amps 振幅数组fs 频率数组ts 采样时间点"""# ts 和 fs 的外积&#xff0c…

Spring Cloud(十三):Spring 扩展

Spring扩展点 Bean的生命周期中的BeanPostProcessor扩展点Spring扩展点梳理 Spring扩展点应用场景 整合Nacos 服务注册 ApplicationListener扩展场景——监听容器中发布的事件Lifecycle Nacos 发布订阅 & Eureka 服务启动、同步、剔除Lifecycle扩展场景——管理具有启动、停…

JSP快速入门

目录 1、jsp简述 2、JSP快速入门 2.1、搭建环境 2.2、导入JSP页面 2.3、编写代码 2.4、启动测试 3、JSP原理 4、JSP脚本 4.1、JSP脚本的分类 4.2、案例 4.2.1、需求 4.2.2、实现 ​编辑 4.2.3、测试 ​编辑4.3、JSP缺点 5、JSP语法 5.1、JSP页面的基本结构…

【每日一题Day36】LC1742盒子中小球的最大数量 | 哈希表 找规律

盒子中小球的最大数量【LC1742】 You are working in a ball factory where you have n balls numbered from lowLimit up to highLimit inclusive (i.e., n highLimit - lowLimit 1), and an infinite number of boxes numbered from 1 to infinity. Your job at this facto…

[附源码]java毕业设计养老院管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C++ 语言学习 day10 复习(2)

1.友元 的三种形式 /*********** 友元 ************ * ①全局函数做友元 * ②类做友元 * ③类成员函数做友元 * **************************/ 代码&#xff1a; #include <iostream> #include <string> using namespace std;/* ③类函数友元 : 程序规则{ 自上…

Charles下载抓包基本流程

一、Charles官网下载链接&#xff1a; https://www.charlesproxy.com/download/ 二、抓包步骤&#xff1a; 1、安装Charles&#xff0c;并打开 2、电脑设置代理端口&#xff1a; 打开charles->Proxy->Proxy Settings,设置代理端口&#xff0c;如图所示 3、手机设置代…

Day10--配置uni-app的开发环境

1.啥子是ui-app呢&#xff1f; 1》官方介绍&#xff1a; 2》博主介绍 ************************************************************************************************************** 2.开发工具建议使用HBuilder X *************************************************…

BSA/HSA表面修饰二甘醇酐,人血清白蛋白HSA、牛血清白蛋白BSA偶联二甘醇酐

BSA作用&#xff1a; BSA一般做为稳定剂被用于限制酶或者修饰酶的保存溶液和反应液中&#xff0c;因为有些酶在低浓度下不稳定或活性低。加入BSA后&#xff0c;它可能起到“保护”或“载体”作用&#xff0c;不少酶类添加 BSA后能使其活性大幅度提高。不需要加BSA的酶加入BSA一…

【时序预测-SVM】基于鲸鱼算法优化支持向量机SVM实现时序数据预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【数据结构】二叉树详解(上篇)

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《数据结构》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 二叉树&…

18 【Redux Toolkit】

18 【Redux Toolkit】 上边的案例我们一直在使用Redux核心库来使用Redux&#xff0c;除了Redux核心库外Redux还为我们提供了一种使用Redux的方式——Redux Toolkit。它的名字起的非常直白&#xff0c;Redux工具包&#xff0c;简称RTK。RTK可以帮助我们处理使用Redux过程中的重…

ABTest样本量计算

A/B 测试一般是比较实验组和对照组在某些指标上是否存在差异&#xff0c;当然更多时候是看实验组相比对照组某个指标表现是否更好。 这样的对比在统计学上叫做两样本假设检验&#xff0c;即实验组和对照组为两样本&#xff0c;假设检验的原假设Ho&#xff1a;实验组和对照组无…

Springboot 整合 JWT + Redis 实现双Token 校验Demo(简单实现)

一、新建一个SpringBoot 项目&#xff0c;springboot项目创建过程详见 mac idea 创建 springboot 项目_JAVA&#xff24;WangJing的博客-CSDN博客_mac idea创建springboot项目 二、SpringBoot 整合使用 Rdis SpringBoot 项目 添加 redis配置_JAVA&#xff24;WangJing的博客…

Linux内存映射函数mmap与匿名内存块

学习系列&#xff1a;《APUE14.8》《CSAPP9.8.4》 1 总结 memory-mapped io可以将文件映射到内存中的buffer&#xff0c;当我们从buffer读写数据时&#xff0c;其实操作的是对应文件中的数据。这样可以达到不使用READ/WRITE的IO操作。mmap也可以直接映射匿名内存块&#xff0c…

零信任对企业安全防护能起到什么作用?

随着网络攻击的不断演变&#xff0c;变得更加普遍和复杂&#xff0c;企业正在寻找一种基于身份的网络安全新方法。这些策略和解决方案旨在保护企业内的所有人和机器&#xff0c;并用于检测和防止身份驱动的违规行为。 企业很容易被感染&#xff0c;但问题在于如何找到解决方案。…

基于花朵授粉算法的无线传感器网络部署优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

hadoop集群安装(二):克隆服务器集群并免密

文章目录说明分享集群构建集群规划角色划分配置主机名、ip和主机名映射ssh免密总结说明 已 上篇 创建模型虚拟机为基础构建hadoop集群 分享 大数据博客列表开发记录汇总个人java工具库 项目https://gitee.com/wangzonghui/object-tool 包含json、string、集合、excel、zip压缩…

美食杰项目 -- 个人主页(四)

目录前言&#xff1a;具体实现思路&#xff1a;步骤&#xff1a;1. 展示美食杰菜谱大全效果2. 引入element-ui3. 代码总结&#xff1a;前言&#xff1a; 本文给大家讲解&#xff0c;美食杰项目中 实现个人主页的效果&#xff0c;和具体代码。 具体实现思路&#xff1a; 判断是…