【MySQL】深入了解索引背后的内部结构

目录

索引的认识:

作用:

索引的使用:

索引底层的数据结构:

哈希表

AVL树

红黑树

B树:

B+树:

B+树搜索:


索引的认识:

索引是数据库中的一个数据结构,用于加速查询操作。

作用:

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助

比如一本字典,如果一一的查找,这个效率将会很低下。

但如果给它加上标签的话,就一下可以找到你想搜索的东西,所有它大大提高了我们的查询速度。

索引可以提高查询速度,但可能会拖慢增删改的速度,后续对数据进行增删改的操作,都是要同步索引的。但在实际开发中,查询的频率要远远高于增删改的操作,所以这是利大于弊


索引的使用:

//查看索引
show index from 表名;//创建索引
//对于非主键、非唯一约束、非外键的字段,可以创建普通索引
create index 索引名 on 表名(字段名);//删除索引drop index 索引名 on 表名;

操作:

注意:

索引的创建也是一个危险操作!!!
针对空表或者数据量比较小的表中创建索引没有任何问题,但如果表中数据很大,此时创建索引将会引起大量的CPU/硬盘IO的消耗,可能会把MySQL直接搞挂;

解法方法:

1.预测哪个索引可能会频繁使用,根据建议,提前给它创建好
2.引入新的数据库服务器,提取创建好索引,将旧的数据库服务器数据慢慢导入到新服务器中(常规做法);

索引底层的数据结构:

索引一定是引入了一些额外的数据结构,加快了查询速度!

引入索引的目的,就是通过其他的数据结构,来加快查询的速度,以便减小表的遍历!


那么哪些数据结构可以加快查询速度?

1.顺序表:随机访问,并且插入删除效率低下 不适合加快查询速度

2.链表:从头依次遍历,更不能加快查询速度

3.哈希表

哈希表

众所周知,哈希表查询速度是最快的,构造出合适的哈希函数,可以达到O(1)查询速度,即使在极端情况下,将所有值通过哈希函数映射到一个同哈希桶上,达到O(N),这种情况一般只存在于理论上,现实中几乎不可能出现。最坏情况下,设置哈希桶上的每个链表长度为M,O(M)也是近视O(1)。

虽然哈希表的查询速度特别快,但是它只能查找特定的某个值(key),并不是一连串的范围,但数据库中一般要我们查找的情况下是一系列的范围数据,所以并不适合数据库查询;

4.树

二叉搜索树的数据 中序遍历是连续范围的数据 是有序的,可以进行范围查询,如果是一个比较平衡的二叉树搜索树 遍历速度O(logN) 最坏情况下变成一个链表,就会变成O(N)速度

AVL树

是一颗严格的二叉搜索树,左右子树高度不能超过1 所以遍历速度O(logN) 但是当你非常严格的情况下,每次进行增删改的操作,从而触发旋转操作,每次旋转,都会有开销。

红黑树

而红黑树并没有AVL树那么严格,触发旋转的概率很小,虽然没有AVL树平衡,但是查询速度也没差多少

红黑树里面的数据 中序遍历是连续范围的数据 是有序的,可以进行范围查询,但由于它是二叉类型的,如果数据量特别大,这会让树的高度变得非常高,树的高度每加一层,比较次数就会增加一次,由于数据都是保存在硬盘中,就会多要一次硬盘IO操作了,它查询的效率就会变得慢,所以并不适合大规模的数据


因此就引入了B树,它是一个N叉搜索树,同样数量的数据,需要的节点变少了,树的高度大大降低了,从而减小了遍历的次数。

B树:

以上是B树的大概形状

1.每个节点上的key是有序的,比较的时候可以直接用二分查找

2.B树会控制每个节点上的key的数量,如果key太多,就会分裂更多的叶子节点出来

3.多个数据,都是放在一块连续的存储空间上,比较的时候,使用一次IO就可以遍历完整个节点****因此B树更适合对应这种数据量的范围查找,但数据库索引的最终形态是B+树,B树的升级版


B+树:

B+树也是N叉树****对比B树 B+树做了进一步优化

1.B+树每个父节点的元素都会在子节点的最大值出现

**2.**B树的每个节点都包含键值(Key)和相应的值(Value)(包括叶子节点和非叶子节点)。而B+树非叶子节点只存储键值(Key)也就是ID,叶子节点存储所有的数据,并且每个叶子节点是以链表结构存储起来的,B+树可以通过简单的顺序访问叶子节点来高效地执行范围查询。

3.进行每次查询操作,都会落到最终的叶子节点上,每次经历的硬盘IO次数都是稳定的(稳定做一件事在计算机中很重要)

4. B+树的非叶子节点都存储的数据比较小,所有可以存储在内存中,进一步减小硬盘IO的次数

特性

B树

B+树

数据存储位置

数据存储在所有节点(包括内部节点)

数据只存储在叶子节点

内部节点

存储键和值

仅存储键(不存储数据)

叶子节点链接

无链接

叶子节点通过链表连接

查询效率

适合单点查询

更适合范围查询

范围查询性能

较差

非常高效(通过叶子节点链表)

树的高度

相对较高

较低

内存/磁盘利用

内存和磁盘利用相对较低

更高效,能容纳更多节点


Mysql中支持多种存储引擎,其中InnoDB最常用(也是面试做常考查的内容),不同的存储引擎使用的索引也是不同的

B+树搜索:

下面来介绍B+树在有无索引的情况下如何检索:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50),age INT
);

在这张表中,id为主键,所有默认会创建索引,name和age列则没创建索引

1)遍历有主键索引的列

SELECT * FROM employees WHERE id = 5;

MySQL 会利用 B+ 树索引,直接从根节点开始查找,快速定位到id = 5的叶子节点,查询的时间复杂度为 O(log N)。

2)遍历无索引的列

SELECT * FROM EMPLOYEES WHERE NAME = 'zhangsan' ;

MySQL 只能通过全表扫描来查找数据,效率较低,尤其在表的数据量较大时。

**3)**遍历有索引的列却不是主键索引

create index index_id on employees(age) ;

此时为age列创建索引

select * from employees where age = 20 ;

此时根据关于age的B+树找到对应叶子节点,但此时非主键索引的B+树的叶子节点存储的都是主键Id,因此找到Id之后,再在id主键索引的B+树中遍历 找到对应的叶子节点,此时叶子节点才正在存储我们想要找到的数据;

因此需要遍历俩次B+树,第一次找到主键Id,再在主键Id的B+树找到对应的值;

总结:

  • 没有索引的情况下,MySQL 只能通过全表扫描来查找数据,效率较低,尤其在表的数据量较大时。
  • 使用 B+ 树索引的情况下,MySQL 可以通过 B+ 树的查找机制(O(log N) 的复杂度)高效地定位记录,从而大大提升查询性能。B+ 树支持点查询和范围查询,尤其对于大数据量的表,具有非常重要的优化作用。

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

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

相关文章

最新版Node.js下载安装指定版本图文版教程(非常详细)

文字目录 1、什么是Node.js?2、什么是 npm?3、下载Node.js安装包4、详细安装步骤 1、什么是Node.js? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它使 JavaScript 可以在服务器端运行。在 Node.js 出现之前&#…

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块,它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南,涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …

深度解读 Docker Swarm

一、引言 随着业务规模的不断扩大和应用复杂度的增加,容器集群管理的需求应运而生。如何有效地管理和调度大量的容器,确保应用的高可用性、弹性伸缩和资源的合理分配,成为了亟待解决的问题。Docker Swarm 作为 Docker 官方推出的容器集群管理工具,正是在这样的背景下崭露头…

eggnog后kegg结果提取和注释

首先进入KEGG BRITE: KEGG Orthology (KO) 下载json文件 用python处理一下 import json import re import osos.chdir("C:/Users/fordata/Downloads/") with open("ko00001.json","r") as f:fj f.read()kojson json.loads(fj)with open(&qu…

qt6.8安装mysql8.0驱动

qt6.8安装mysql8.0驱动 qt6.8本身是不带mysql驱动。想要在qt里面使用mysql,还是比较麻烦的。需要自己编译驱动 首先下载qt源码,链接Index of /archive/qt/6.8/6.8.1/single 下载mysql对于驱动文件,链接是MySQL :: Download MySQL Connector/C (Archiv…

学习threejs,使用Lensflare模拟镜头眩光

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Lensflare 二、&…

Cortex-M异常处理深度解析:从HardFault到调试实战

文章目录 引言一、Cortex-M异常类型全景图二、关键寄存器:故障分析的“密码本”1. HardFault状态寄存器(HFSR, 0xE000ED2C)2. 可配置故障状态寄存器(CFSR, 0xE000ED28)3. 地址寄存器(BFAR/MMFAR)三、调试实战:从寄存器到代码定位四、自定义HardFault处理程序五、Keil与…

【大模型】DeepSeek与chatGPT的区别以及自身的优势

目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇:《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…

低至3折,百度智能云千帆宣布全面支持DeepSeek-R1/V3调用

DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架 。 出品|产业家 新年伊始,百度智能云又传来新动作 。 2月3日百度智能云宣布, DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架,同步推出超低价格方案,并…

STM32G0B1 ADC DMA normal

目标 ADC 5个通道,希望每1秒采集一遍; CUBEMX 配置 添加代码 #define ADC1_CHANNEL_CNT 5 //采样通道数 #define ADC1_CHANNEL_FRE 3 //单个通道采样次数,用来取平均值 uint16_t adc1_val_buf[ADC1_CHANNEL_CNT*ADC1_CHANNEL_FRE]; //传递…

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命

目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展,部分内容有删除,与原文会有…

OpenEuler学习笔记(二十一):搭建企业AI客户服务例子

在 OpenEuler 上搭建企业 AI 客服可以按照以下步骤进行,以下将以使用开源的 Rasa 框架作为 AI 客服核心,搭配前端界面展示为例: 1. 系统准备 1.1 安装 OpenEuler 确保你已经安装好了 OpenEuler 操作系统,可以从官方网站下载镜像…

【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行

1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。   其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …

Idea 2024.3 使用CodeGPT插件整合Deepseek

哈喽,大家好,我是浮云,最近国产大模型Deepseek异常火爆,作为程序员我也试着玩了一下,首先作为简单的使用,大家进入官网,点击开始对话即可进行简单的聊天使用,点击获取手机app即可安装…

SOME/IP报文格式及发现协议详解

在之前的文章中,我们介绍了SOME/IP协议的几种服务接口。在本篇博客中,主要介绍some/ip协议传输的header报文格式以及SOME/IP-SD发现协议。 目录 流程 报文格式 Message ID Length Request ID protocal version/Interface Version Message Type…

【AIGC魔童】DeepSeek核心创新技术(二):MLA

【AIGC魔童】DeepSeek核心创新技术(二):MLA 1. MLA框架的定义与背景2. MLA框架的技术原理(1)低秩联合压缩(2)查询的低秩压缩(3)旋转位置嵌入(RoPE&#xff09…

idea——IDEA2024版本创建Sping项目无法选择Java 8

目录 一、背景二、解决方式(替换创建项目的源地址) 一、背景 IDEA2024创建一个springboot的项目,本地安装的是1.8,但是在使用Spring Initializr创建项目时,发现版本只有17、21、23。 二、解决方式(替换创…

【自然语言处理】TextRank 算法提取关键词(Python实现)

文章目录 前言PageRank 实现TextRank 简单版源码实现jieba工具包实现TextRank 前言 TextRank 算法是一种基于图的排序算法,主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性,类似于 Google 的 PageRank 算法。Tex…

Docker Desktop安装到其他盘

Docker Desktop 默认安装到c盘,占用空间太大了,想给安装到其他盘,网上找了半天的都不对 正确安装命令: start /w "" "Docker Desktop Installer.exe" install --installation-dirF:\docker命令执行成功&am…