当前位置: 首页 > news >正文

图解Mysql索引原理

概述

是什么

  • 索引像是一本书的目录列表,能根据目录快速的找到具体的书本内容,也就是加快了数据库的查询速度
  • 索引本质是一个数据结构
  • 索引是在存储引擎层,而不是服务器层实现的,所以,并没有统一的索引标准,不同存储引擎的索引的工作方式不同,也不是所有的存储引擎都支持所有类型的索引,即使多个存储引擎支持同一种类型的索引,其底层实现也可能不同————《高性能mysql》

优劣势

优点:

  1. 提高数据检索的效率,降低了数据库的IO成本
  2. 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
  3. 被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些

缺点

  1. 索引会占用磁盘空间
  2. 索引虽然提高了查询的效率,但是会影响增删改的效率,因为每次增删改数据时,数据库要同时更新维护索引的结构

数据结构

索引是存储引擎层面实现的,所以不同的存储引擎使用的索引数据结构也不同,底层结构主要是B+树和哈希两种

hash索引

基于哈希表实现的,对选中的索引列计算出一个哈希码,在哈希表存储的是哈希码以及指向每个数据行的指针(在mysql中,只有memory存储引擎支持哈希索引,且是memory的默认索引方式)
优点: 查找的速度非常快(只需存储对应的哈希值,所以索引的结构十分紧凑)
缺点:

  • 不能避免读取行。哈希表中只包含哈希值和行指针,而不存储字段值
  • 无法用于排序。哈希表的索引数据并不是按照索引列匹配查找的
  • 不支持部分索引列匹配查找。因为哈希索引始终是使用索引列的全部内容来计算哈希值的。
  • 只支持等值比较查询,包括=,IN(),<=>,也不支持范围查找
  • 存在哈希冲突。当出现哈希冲突时,必须遍历链表中所有的行指针,逐行进行比较,直到找到所有符合条件的行。同时,当哈希冲突很多的时候,一些索引维护操作的代价也会很高。例如,如果在某个选择性很低(哈希冲突很多)的列上建立哈希索引,那么当从表中删除一行时,存储引擎需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用,冲突越多,代价越大

B+树

默认的索引底层数据结构是B+树,B+树是一颗多叉平衡搜索树,如图:

  1. B+树的节点中存储着多个元素,每个节点内有多个分叉
  2. 叶子结点包含了所有的索引项
  3. 只有叶子结点存储数据,非叶子结点只存储索引键
  4. 叶子结点使用双向指针连接,形成了一个双向有序链表,支持范围查询
  5. 在查找数据的时候,由于数据都存放在最底层的叶子节点上,所以每次查找都需要检索到叶子节点才能查询到数据。所以在需要查询数据的情况下每次的磁盘的IO跟树高有直接的关系

对比B树

B树也是一个平衡多叉树,结构如图:

  1. B树的节点中存储着多个元素,每个内节点有多个分叉
  2. 所有节点中的元素包含键值和数据,如果data存储的是行记录,行的大小随着列数的增多,所占空间会变大。这时,一个页中可存储的数据量就会变少,树相应就会变高,磁盘IO次数就会变大
  3. 父节点当中的元素不会出现在子节点中
  4. 叶节点之间没有指针连接,不支持范围查询

Mysql索引

MyISAM索引(非聚簇索引)

使用B+树作为索引结构,叶节点的data域存放的是数据记录的地址(主键索引和辅助索引存储的都是数据记录的地址),也叫做“非聚簇索引”,如图

  1. 主键索引非必需,若存在则主键索引必须唯一
  2. 辅助索引的结构和主键索引结构一致,可以重复,会存在多个符合条件的数据,所以即使是等值查询,也需要按照范围查询的方式在辅助索引树中检索数据
  3. 检索过程:首先按照B+树搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址,去读取相应的表数据记录

InnoDB索引

主键索引(聚簇索引)

叶子节点的data域存储的是完整的数据记录,key就是数据表的主键,也叫做“聚簇索引,如图:

  1. 检索过程:首先按照B+树搜索算法搜索索引,如果指定的key存在,则取出其data域的值即为表数据
  2. InnoDB要求必须有主键,且唯一;如果没有显示指定,mysql系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,mysql会自动为InnoDB表生成一个隐含字段作为主键,类型为long
  3. 尽量在InnoDB上采用自增字段做表的主键;因为InnoDB数据文件本身是一颗B+树,非单调的主键会造成在插入记录时数据文件为了维持B+树的特性而频繁的分裂调整,十分低效,如果表使用自增主键,那么每次插入新的记录,记录会顺序添加到当前索引节点的后续未知,当一页写满,就会自动开辟一个新的页
  4. 不推荐用uuid做主键;uuid无序,插入操作会频繁做分裂调整,而且字段更长占用的空间更大,空间一大,一页存储的索引数据就减少,就需要占用更多页,查询时的磁盘io次数会增加,影响效率

辅助索引

辅助索引的叶子结点的data域存储的是相应记录主键的值,也就是InnoDB的所有辅助索引都引用主键作为data域,当主键索引行移动或数据页分裂时,减少了辅助索引的维护工作,如图所示:

  • 检索过程:首先按照B+树搜索算法搜索索引,如果指定的key存在,则取出其data域的值即主键id,然后用主键id去主键索引树查询,找到对应的数据。这个过程中去主键索引树查询的过程叫做“回表”

联合索引和最左匹配原则

  • 联合索引是用表中的多个字段组成一个索引,比如创建一个联合索引idx_abc(a,b,c),那么该索引的每个键都包含这三个字段,且是按a,b,c依次排列
  • 联合索引的存储方式:最底层的叶子节点按照第一列a列从左到右递增排列,但是b列和c列是无序的,b列只有在a列值相等的情况下小范围内递增有序,而c列只能在a,b两列相等的情况下小范围内递增有序
  • 联合索引的检索方式:比如查询条件为where a=1 and b=28 and c=3,那么B+树会先比较a列来确定下一步应该搜索的方向,往左还是往右;如果a列相同再比较b列;但是如果查询条件没有a列,B+树就不知道第一步应该从哪个节点查起,所以这也是最左前缀匹配原则的原因
  • 最左前缀匹配原则:使用组合索引查询时,mysql会一直向右匹配直至遇到范围查询(>、<、between、like)就停止匹配
  • 用联合索引id_abc查询要符合最左匹配原则,相当于创建了(a)、(a,b)(a,b,c)三个索引
  • 联合索引的创建原则:在创建联合索引的时候因该把频繁使用的列、区分度高的列放在前面,频繁使用代表索引利用率高,区分度高代表筛选粒度大,这些都是在索引创建的需要考虑到的优化场景,也可以在常需要作为查询返回的字段上增加到联合索引中,如果在联合索引上增加一个字段而就能用到覆盖索引,那就可以加上

覆盖索引

覆盖索引并不是一种索引结构,而是一种sql优化手段。这源于辅助索引和主键索引的关键,如果只用覆盖索引那么必然要去主键索引那回表查询到需要的字段,但是如果在辅助索引树上能查询到所需的字段呢,就不需要再去主键索引上查询了呀,减少了回表就减少了磁盘io,就提升了查询速度呀

辅助索引树上有两块数据,一个是索引key,一个是data域,data域固定是主键id没法变,前面讲的联合索引表明索引key可以是多个字段组合的,那么就可以合理使用联合索引实现覆盖索引,减少回表次数,提升查询效率

⚠️使用这种手段必须是频繁查询的字段,不然没提升速度反而增加了索引结点的占用空间导致效率下降

总结

希望这些内容可以帮助你更好的理解mysql的索引,对sql优化能有更好的想法💡

相关文章:

图解Mysql索引原理

概述 是什么 索引像是一本书的目录列表&#xff0c;能根据目录快速的找到具体的书本内容&#xff0c;也就是加快了数据库的查询速度索引本质是一个数据结构索引是在存储引擎层&#xff0c;而不是服务器层实现的&#xff0c;所以&#xff0c;并没有统一的索引标准&#xff0c;…...

Arduino网页服务器:如何将Arduino开发板用作Web服务器

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天&#xff0c;我将和大家分享一个有趣且实用的项目——如何使用Arduino开发板搭建一个简易的网页服务器。通过这个项目&#xff0c;你可以将Arduino连接到互联网&#xff0c;并通过网页控制或查询Arduino的状态。 一、项目背景与…...

大模型日报2024-06-05

大模型日报 2024-06-05 大模型资讯 AI气象预测取得重大进展&#xff1a;单台桌面电脑即可运行全球天气模型 摘要: 一项新的人工智能天气预测模型已经取得重大进展&#xff0c;该模型能够在一台普通的桌面电脑上运行&#xff0c;预测全球天气。这意味着即使没有复杂的物理计算&a…...

LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关

角色扮演&#xff1a;在系统指令中告诉千问你需要它扮演的角色&#xff0c;即可沉浸式和该角色对话交流语言风格&#xff1a;简单调整 LLM 的语言风格任务设定&#xff1a;比如旅行规划&#xff0c;小红书文案助手这样的专项任务处理System message 也可以被用于规定 LLM 的答复…...

Spring系统学习 - Spring入门

什么是Spring&#xff1f; Spring翻译过来就是春天的意思&#xff0c;字面意思&#xff0c;冠以Spring的意思就是想表示使用这个框架&#xff0c;代表程序员的春天来了&#xff0c;实际上就是让开发更加简单方便&#xff0c;实际上Spring确实做到了。 官网地址&#xff1a;ht…...

Priority_queue

一、priority_queue的介绍和使用 1.1 priority_queue的介绍 1.优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 2.优先队列类似于堆&#xff0c; 在堆中可以随时插入元素&#xff0c; 并且只能检索最大堆…...

SpringMVC:获取请求数据

1. 通过RequestParma注解接收 /**** value和name都可以使用&#xff0c;互为别名* 如果此处设置了需要什么参数而前端请求时没有提供则会报400&#xff08;请求参数不一致错误&#xff09;* required参数用于设置该参数是否为必须传递参数&#xff0c;默认为true必须传递* defa…...

深度学习 --- stanford cs231 编程作业(assignment1,Q2: SVM分类器)

stanford cs231 编程作业之SVM分类器 写在最前面&#xff1a; 深度学习&#xff0c;或者是广义上的任何学习&#xff0c;都是“行千里路”胜过“读万卷书”的学识。这两天光是学了斯坦福cs231n的一些基础理论&#xff0c;越往后学越觉得没什么。但听的云里雾里的地方也越来越多…...

【scikit-learn010】sklearn算法模型清单实战及经验总结(已更新)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架模型算法包相关技术点及经验。 3.欢迎批评指正,欢迎互三,跪谢一键…...

Rethinking overlooked aspects in vision-language models

探讨多模态视觉语言模型的一些有趣结论欢迎关注 CVHub!https://mp.weixin.qq.com/s/zouNu-g-33_7JoX3Uscxtw1.Introduction 多模态模型架构上的变化不大,数据的差距比较大,输入分辨率和输入llm的视觉token大小是比较关键的,适配器,VIT和语言模型则不是那么关键。InternVL-…...

【漯河市人才交流中心_登录安全分析报告-Ajax泄漏滑动距离导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

C语言—字符函数和字符串函数

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例&#xff1a;将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件&#xff1a;ctype.h C语言提供了2…...

爬山算法的详细介绍

爬山算法&#xff08;Hill Climbing Algorithm&#xff09;是一种基于启发式的局部搜索算法&#xff0c;常用于解决优化问题。它的核心思想是从当前解的邻域中选择能够使目标函数值最大&#xff08;或最小&#xff09;的下一个解作为当前解&#xff0c;直到找到一个满足问题要求…...

硕士课程 可穿戴设备之作业一

作业一 第一个代码使用的方法是出自于[1]。 框架结构 如下图&#xff0c;不过根据对代码的解读&#xff0c;发现作者在代码中省去了对SSR部件的实现&#xff0c;下文再说。 Troika框架由三个关键部件组成&#xff1a;信号分解&#xff0c;SSR和光谱峰值跟踪。&#xff08;粗…...

测试记录3:WLS2运行Linux界面

1.WLS1转到WLS2 &#xff08;1&#xff09;根据自己的平台&#xff0c;下载WLS2安装包 x64: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi arm64: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi &#xff08;2&…...

好用软件推荐

软件功能相关介绍地址FastStone截图&#xff08;长截图、定时截图等&#xff09;CSDNhttps://www.faststone.org/FSCaptureDownload.htmQuicker快捷访问https://getquicker.net/https://getquicker.net/...

王学岗鸿蒙开发(北向)——————(二)TS基本语法详解

1&#xff0c;Ts(TypeScript)语法相当于JAVAScript类型&#xff0c;鸿蒙arkTs是基于TS语言的,当然artTs也融合了其它的语言。 2&#xff0c;本篇文章是基于n9版本。注意,有些语法是已经不能用的。 3&#xff0c; 4&#xff0c;变量:用来存储数据,数字字母组成&#xff0c;数字不…...

【网络协议 | HTTP】HTTP总结与全梳理(一) —— HTTP协议超详细教程

&#x1f525;博客简介&#xff1a;开了几个专栏&#xff0c;针对 Linux 和 rtos 系统&#xff0c;嵌入式开发和音视频开发&#xff0c;结合多年工作经验&#xff0c;跟大家分享交流嵌入式软硬件技术、音视频技术的干货。   ✍️系列专栏&#xff1a;C/C、Linux、rtos、嵌入式…...

java基础选择题--11

1. 以下保留字( )不能出现在说明虚函数原型的语句中。A.static B.operator C.void D.const 参考答案&#xff1a;A 2. 一个类中只能定义一个析构函数。( )A.对 B.错 参考答案&#xff1a;A 解释&#xff1a; 在C中&#xff0c;一个类只能有一个析构函数。析构函数在对象生…...

欲除烦恼须无我,各有前因莫羡人

欲除烦恼须无我&#xff0c;各有前因莫羡人...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...