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

索引的本质

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

索引的数据结构

  • 二叉树
  • 红黑数
  • Hash表
  • B-Tree

MySQL索引底层为啥不用二叉树

如图,对单边增长的数据,索引效率没有什么提升
在这里插入图片描述

MySQL索引底层为啥不用红黑数

红黑数:二叉平衡树
随着数据的增长,数的高度会越来越高
对索引的查找效率没有什么帮助
在这里插入图片描述

B Tree树

  • 叶节点具有相同的深度,叶子节点的指针为空
  • 所有索引元素不重复
  • 节点中的数据索引从左到右递增排列
    在这里插入图片描述

B+Tree树

  • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  • 叶子节点包含所有的索引字段

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

B树和B+树在构建索引上,MySQL为什么最后选择了B+树?

对于树结构来说,影响索引查找效率的就是树的高度,B+树非叶子结点不存储date,只存储索引,这样的话在存储相同数据量的情况下,B+树数据结构的索引树比B树的高度更小,查询速度更快。

Hash结构

在这里插入图片描述

MyISAM存储引擎实现

MyISAM索引文件和数据文件是分离的(非聚集)

InnoDB索引引擎索引实现

在这里插入图片描述

表数据文件本身就是按照B+树组织的一个索引结构文件
聚集索引-叶子结点包含了完整的数据记录

聚集索引和非聚集索引在查找速度上那一快?

聚集索引。聚集索引查到索引后可以直接获取数据,非聚集索引在查到索引后还要跨文件获取数据。

为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

表数据文件需要B+树来组织索引结构文件
如果表中有主键,MySQL就会用主键来组织B+树,如果没有主键就会选择所有元素都不一样的一列来组织B+树,如果不存在,MySQL会创建一个隐藏列,来维护一个唯一id来组织B+树。

在找元素的时候是从根结点开始查找,索引定位的过程中,经历过很多次比大小,用整型比大小速度快,且整型占用内存小。

非自增时会导致叶子节点的分裂和树的自我平衡调整,影响效率。自增的话只需要往后面添加就可以了。

为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省空间)

联合索引最左前缀原理

如图:联合主键索引
在这里插入图片描述
索引是最左前缀原理,因为是排好序的
例如:
select * from table where name = ? and age = ?
由图可知,B+树是先按照name进行排序,然后按照age排序,最后按照position进行排序。上面这个SQL语句就可以用到拍好序的索引;

select * from table where age = ? and position = ?
由于索引结构age是在name排序后再排的序,所以不通过name,直接通过age进行查找,相当于没有排序,所以不走索引。

学习数据结构的网站
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

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

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

相关文章

并发与数据一致性:事务的保障

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力! 并发 并发是计算机系统中同时执行多个独立任务的能力。通过共享资源和并发执行,系统可以提高性能和效率。然而&…

【C 语言经典100例】C 练习实例29

题目&#xff1a;给一个不多于5位的正整数&#xff0c;要求&#xff1a;一、求它是几位数&#xff0c;二、逆序打印出各位数字。 程序分析&#xff1a;学会分解出每一位数&#xff0c;如下解释。 #include <stdio.h>int main( ) {long a,b,c,d,e,x;printf("请输入…

silero-vad 官方新增了java 的demo

原来参考android GitHub - gkonovalov/android-vad: Android Voice Activity Detection (VAD) library. Supports WebRTC VAD GMM, Silero VAD DNN, Yamnet VAD DNN models.的kt改写java demo 可费劲了 上个月 https://github.com/snakers4/silero-vad/tree/master/examples…

MSSQL注入的入门讲解及示例

MSSQL注入是一种常见的网络攻击手段&#xff0c;主要是通过在输入框中插入恶意的SQL代码&#xff0c;使得MSSQL注入是一种常见的网络攻击手段&#xff0c;主要是通过在输入框中插入恶意的SQL代码&#xff0c;使得原本的SQL查询语句被篡改&#xff0c;从而达到攻击者的目的。下面…

计算虚拟化之内存

有了虚拟机&#xff0c;内存就变成了四类&#xff1a; 虚拟机里面的虚拟内存&#xff08;Guest OS Virtual Memory&#xff0c;GVA&#xff09;&#xff0c;这是虚拟机里面的进程看到的内存空间&#xff1b;虚拟机里面的物理内存&#xff08;Guest OS Physical Memory&#xf…

STM32CubeIDE(CUBE-MX hal库)----定时器

系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 文章目录 系列文章目录前言一、定时器二、使用步骤三、HAL库实验代码三、标准库代码 前言 STM32定时器是一种多功能外设&#…

[iOS开发]UITableView的性能优化

一些基础的优化 &#xff08;一&#xff09;CPU 1. 用轻量级对象 比如用不到事件处理的地方&#xff0c;可以考虑使用 CALayer 取代 UIView CALayer * imageLayer [CALayer layer]; imageLayer.bounds CGRectMake(0,0,200,100); imageLayer.position CGPointMake(200,200…

Python基础学习之包与模块详解

文章目录 前言什么是 Python 的包与模块包的身份证如何创建包创建包的小练习 包的导入 - import模块的导入 - from…import导入子包及子包函数的调用导入主包及主包的函数调用导入的包与子包模块之间过长如何优化 强大的第三方包什么是第三方包如何安装第三方包 总结关于Python…

智能优化算法应用:基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.生物地理学算法4.实验参数设定5.算法结果…

【matlab程序】matlab利用工具包nctool读取grib2、nc、opendaf、hdf5、hdf4等格式数据

【matlab程序】matlab利用工具包nctool读取grib2、nc、opendaf、hdf5、hdf4等格式数据 引用&#xff1a; B. Schlining, R. Signell, A. Crosby, nctoolbox (2009), Github repository, https://github.com/nctoolbox/nctoolbox Brief summary: nctoolbox is a Matlab toolbox…

时间序列预测实战(二十一)PyTorch实现TCN卷积进行时间序列预测(专为新手编写的自研架构)

一、本文介绍 本篇文章给大家带来的是利用我个人编写的架构进行TCN时间序列卷积进行时间序列建模&#xff08;专门为了时间序列领域新人编写的架构&#xff0c;简单不同于市面上大家用GPT写的代码&#xff09;&#xff0c;包括结果可视化、支持单元预测、多元预测、模型拟合效…

【docker系列】docker实战之部署SpringBoot项目

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于SpringBoot房产销售系统

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统&#xff0c;它彻底改变了过去传统的…

git 配置多端多个账号(码云、github、gitlab)

首先要确认已经安装 Git&#xff0c;可以通过执行 git --version 命令来查看当前安装的版本。 想为同一个电脑配置多个 Git 账户&#xff0c;需要完成以下整体流程&#xff1a; 清空默认的全局 user.name 和 user.email 配置项&#xff1b;为不同的 Git 账户生成不同的 SSH 密…

Webpack的ts的配置详细教程

文章目录 前言ts是什么&#xff1f;基础配置LoaderSource MapsClient types使用第三方类库导入其他资源 后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;webpack &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握…

【MySQL】事务(事务四大特性+四种隔离级别+MVCC)

事务 前言正式开始事务的四大特性为什么会出现事务事务的版本支持事务提交方式事务常见操作方式启动事务回滚演示提交事务事务的异常autocommit 事务的隔离性隔离级别查看隔离级别修改隔离级别验证四种隔离级别读未提交(read uncommitted) —— 缩写为RU读提交(read committed)…

传统算法:使用pygame实现Dijkstra 算法

代码需要考虑两个主要部分:Dijkstra 算法和 Pygame 图形绘制。 Dijkstra 算法部分 图的表示: 使用字典 nodes 表示节点的位置,字典 edges 表示节点之间的边及其权重。 Dijkstra 算法实现: dijkstra 函数使用 Dijkstra 算法来计算从指定起点到所有其他节点的最短路径。它维…

3款厉害的小工具,小黑子都在用!

大家好&#xff0c;我是 Javapub。 程序员与普通人最大的区别是什么&#xff0c;当然是会使用工具。基于一些同学经常问我的问题&#xff0c;接下来给大家分享几款我经常使用的工具&#xff0c;主打一个提升效率。 第一款 Everything 用 windwos 的同学都体会过&#xff0c;…

ERP软件对Oracle安全产品的支持

这里的ERP软件仅指SAP ECC和Oracle EBS。 先来看Oracle EBS&#xff1a; EBS的认证查询方式&#xff0c;和数据库认证是一样的。这个体验到时不错。 结果中和安全相关的有&#xff1a; Oracle Database VaultTransparent Data Encryption TDE被支持很容易理解&#xff0c;…

指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)

文章目录 &#x1f680;前言&#x1f680;两段有趣的代码✈️typedef关键字 &#x1f680;指针数组&#x1f680;简易计算器的实现 &#x1f680;前言 基于阿辉前两篇博客指针的基础篇和进阶篇对于指针的了解&#xff0c;那么今天阿辉将为大家介绍C语言的指针剩下的部分&#…