深入理解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,一经查实,立即删除!

相关文章

计算虚拟化之内存

有了虚拟机,内存就变成了四类: 虚拟机里面的虚拟内存(Guest OS Virtual Memory,GVA),这是虚拟机里面的进程看到的内存空间;虚拟机里面的物理内存(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的性能优化

一些基础的优化 (一)CPU 1. 用轻量级对象 比如用不到事件处理的地方,可以考虑使用 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)覆盖优化 - 附代码

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

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

【matlab程序】matlab利用工具包nctool读取grib2、nc、opendaf、hdf5、hdf4等格式数据 引用: 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时间序列卷积进行时间序列建模(专门为了时间序列领域新人编写的架构,简单不同于市面上大家用GPT写的代码),包括结果可视化、支持单元预测、多元预测、模型拟合效…

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

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

基于SpringBoot房产销售系统

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

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

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

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

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

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

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

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

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

2021年9月15日 Go生态洞察:TLS加密套件的自动排序机制

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Linux CentOS7 fdisk

Centos7的磁盘管理包括添加磁盘、查看磁盘信息、磁盘分区、格式化、挂载和卸载,逻辑卷管理等。 对分区后的磁盘格式化比较简单,执行mkfs命令即可;而挂载可以使用的分区执行mount命令很方便地完成。本文仅讨论新添加磁盘的分区操作。 一、添…

C++学习之继承中修改成员权限细节

看看下面的代码 这是错误的 class A { public:int x 10; }; class B :public A {using A::x;int x 100; };看看函数 class A { public:void fun(){cout << "uuuu" << endl;} }; class B :public A { public:using A::fun;void fun(){cout << …

【C++】了解模板

这里是目录 前言函数模板函数模板的实例化类模板 前言 如果我们要交换两个数字&#xff0c;那么我们就需要写一个Swap函数来进行交换&#xff0c;那如果我们要交换char类型的数据呢&#xff1f;那又要写一份Swap的函数重载&#xff0c;参数的两个类型是char&#xff0c;那我们…

phpoffice在tp框架中如何实现导入导出功能

安装 phpoffice/phpspreadsheet 库 composer require phpoffice/phpspreadsheet 导入功能 创建一个用于上传文件的视图&#xff0c;可以使用元素来实现文件上传。 <!-- application/view/your/import.html --><form action"{:url(your/import)}" method&q…

2021年8月18日 Go生态洞察:整合Go的网络体验

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

WIN10系统自带硬盘测速工具使用

前段时间在捣腾电脑硬盘这一块&#xff0c;因为现在固态硬盘价格比较低了&#xff0c;所以想换一下&#xff0c;给自己的电脑升个级。现在硬盘有多种接口&#xff0c;常见的就是SATA&#xff0c;mSATA&#xff0c;m.2, NVME&#xff0c;PCIE。这里PCIE的接口是直连的&#xff0…