Mysql高级之索引结构详解

news2024/12/24 10:01:02

Mysql的索引详解

  • 1.索引定义
  • 2.索引结构
    • 2.1数据结构分析
      • 2.1.1熟知的数据结构
      • 2.1.2分析为什么这么多的数据结构不全适用于索引结构
    • 2.2Hash结构
    • 2.3B+ tree结构
  • 3.索引分类
    • 3.1聚集索引(聚簇索引)
    • 3.2非聚集索引(稀疏索引)
    • 3.3联合索引
    • 3.4主键索引和非主键

1.索引定义

索引是mysql帮我们排好序的数据结构,可以更快捷的查找数据

2.索引结构

2.1数据结构分析

2.1.1熟知的数据结构

  • hash
  • 二叉树
  • 红黑树
  • B-tree

2.1.2分析为什么这么多的数据结构不全适用于索引结构

  • 二叉树:其中二叉树有个众所周知的问题,就是容易形成“歪脖子”树,形成类似链表的结构查询速度很慢。
  • 红黑树:红黑树对二叉树做了优化,保证了左子树和右子树的均衡,不会出现歪脖子树,但是缺点是层级太深,不适合作为mysql的索引结构(索引的查找方式会在下面进行分析)

索引的查找方式:索引结构实际上存储在磁盘上的文件中,mysql根据索引定位,每定位一个位置后都需要加载到内存中然后在查找下一层级,如果层级很深就需要进行多次磁盘io,而这个操作是很耗时的。

总结:排除掉二叉树和红黑树后适合作为索引结构就是hash结构和B-tree

但是实际上mysql的索引结构使用的是B+tree,这里就需要说明B-tree和B+tree的区别了。
B-tree和B+tree的区别

  • 非叶子节点不存储数据,只存储索引(因为叶子节点有全量的索引,非叶子节点存储的为冗余索引),这样可以在非叶子节点的层级放更多的索引。
  • 叶子节点包含所以的索引
  • 叶子节点使用指针链接,提高了区间的访问能力

针对上面说的非叶子节点存储更多的索引做解释:
我们知道mysql在加载索引时一个磁盘页的大小为16k,如果非叶子节点存储数据,那么它的大小就远远大于只存储索引时的大小。所以如果非叶子节点只存储索引数据,那么一个磁盘页加载的索引数据就更多,减少了磁盘加载次数,这样可以优化mysql的查询效率。

2.2Hash结构

hash结构有个好处,就是查找的时候只需要对key进行一次hash运算就能算出存储位置。但是也存在这很多问题,比如hash冲突,以及sql中的范围查询。所以一板情况下我们不是hash结构建立索引。

2.3B+ tree结构

B+tree结构可以很好的解决索引数据存储层级过深的问题,而且相比与B-tree优化了每个磁盘页可加载的索引数量,同时在叶子节点使用指针链接,提高了区间的访问能力,我们常用的索引结构就是B+tree.

3.索引分类

3.1聚集索引(聚簇索引)

聚集索引实际上是一种文件存储方式,索引文件和数据文件存储在一起称之为聚集索引
InnoDB存储引擎的索引和数据就存放在一个文件。
在这里插入图片描述
主键索引的叶子节点存储的就是响应的行数据

3.2非聚集索引(稀疏索引)

索引文件和数据文件分开存储称为非聚集索引
MyISAM存储引擎的索引文件和数据文件分开存储。
在这里插入图片描述主键索引的叶子节点指向数据存储的位置,通过主键索引定位到数据后需要再根据主键索引指向的位置加载相应数据

3.3联合索引

多列字段联合建立索引,按照执行顺序一次排序。

3.4主键索引和非主键

在这里插入图片描述

在这里插入图片描述非主键索引的叶子节点存储的是主键索引,需要进行回表操作,根据定位的主键索引在进行查询对应的行数据。
回表:跨两个B+tree查找数据,我们称之为回表操作。

由此可以引发很多索引优化需要注意的地方,比如可以通过二级索引直接查询的结果避免回表查询。(假设联合索引为二级索引,查询数据时使用覆盖索引,所有查询字段在二级索引树就能获取到,此时就直接在二级索引树查询结果返回,另外二级索引树因为不存具体行数据,索引比主键索引小因此效率也能更高)

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

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

相关文章

用于健康医疗的AI计算机视觉:使提供者能够增强患者护理

通过模仿和充当人力的力量,人工智能驱动的计算机视觉技术正在帮助医疗保健行业的医生、护士和企业更好地满足患者的需求。例如通过实时视频分析新见解可帮助他们节省时间、金钱和生命,同时为从患者入院到手术室等各个方面开发更安全、更高效的流程。用于…

java面试八股文之------Redis夺命连环25问

java面试八股文之------Redis夺命连环25问👨‍🎓1.为什么redis这么快👨‍🎓2.redis的应用场景,为什么要用👨‍🎓3.redis6.0之前为什么一直不使用多线程,6.0为甚么又使用多线程了&…

Spring Cloud融合Nacos实现服务配置中心 | Spring Cloud 7

一、服务配置中心 先我们来看一下,微服务架构下关于配置文件的一些问题: 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。 配置文件无法区分环境&a…

jQuery和ajax案例练习

jQuery和ajax案例练习1.使用jquery修改div元素的背景色(随意颜色)2.使用jquery修改div的子元素p的内容为"我是子元素"3.使用jquery修改第二个p元素的背景色为"orange"4.使用jQuery添加文本的方式将“添加的文本”追加到p标签的后方5.删除列表元素中最后一个…

理解依赖注入(DI – Dependency Injection)

文章目录依赖注入1.provide(提供)1.1 在选项式 API 中,可通过provide选项为后代提供数据1.2 如果想访问到组件的实例this,provide必须采用函数的方式(不能用箭头函数),为保证注入方和供给方之间的响应性链接&#xff0…

K8s:开源安全平台 kubescape 实现 Pod 的安全合规检查/镜像漏洞扫描

写在前面 生产环境中的 k8s 集群安全不可忽略,即使是内网环境容器化的应用部署虽然本质上没有变化,始终是机器上的一个进程但是提高了安全问题的处理的复杂性分享一个开源的 k8s 集群安全合规检查/漏洞扫描 工具 kubescape博文内容涉及: kube…

工控机如何安装Python

钡铼技术BL302基于arm架构工控机,采用NXP的高性能处理器I.MX6ULL 运行速度高达800MHz,并配有8GFlash空间和512M RAM,硬件接口有2个网口、2个串口、1个USB口、1个SD卡卡槽、1个HDMI显示接口,可运行LINUX、Ubuntu、Debian等OS&#…

项目管理:如何做到项目信息透明?

项目管理中,管理者最担心的问题是什么?方项目进度不透明,项目的进展不明确,使用项目管理工具让项目进度一目了然。 1、项目管理必须目标明确。 明确的目标能够更好地指导接下来的一系列项目管理工作。 2、项目管理必须资源配置…

Redis缓存一致

背景介绍: redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差…

2023 工业互联网平台:智慧制硅厂 Web SCADA 生产线

我国目前是全球最大的工业硅生产国、消费国和贸易国,且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识,随着我国“双碳”目标的推进,光伏产业链快速发展,在光伏装机需求的带动下,…

干货分享!PCBA元器件间距的可焊性设计

“ SMT贴片加工逐步往高密度、细间距的设计发展,元器件的最小间距设计需考虑smt厂家的经验程度和工艺是否完善。元器件最小间距的设计除了保证smt焊盘间不易短接的安全间距外,还应考虑元器件的可维护性。 ” 元器件布局为什么要保证安全间距&#xff…

喜讯!华秋电子荣获第六届“高新杯”十大优秀企业奖

2月22日,由中科为集团与广东高科技产业商会联合举办的“第六届‘高新杯’十大优秀高新企业颁奖典礼暨2023年高新企业高质量发展春茗会”,在深圳隆重举行。 中科为集团自2014年举办首届“高新杯”以来,已主办了5届,共计600多家企业…

如何在CSDN上赚钱:CSDN收益渠道分析

文章目录说明哪些人,哪些资源赚到了钱?上传付费资源的策略一些经验说明 在CSDN平台上要想获得回报,主要的渠道: 付费资源付费专栏文章打赏 这三个都有门槛,上传付费资源需要原力等级达到Lv5,粉丝数500&a…

微信怎么发文字朋友圈?简单快捷的方法,只需1分钟

微信是一个非常受欢迎的聊天工具,也是一个交友,分享生活的平台。其中,朋友圈是最受欢迎的功能之一,让我们可以与好友分享自己的生活点滴,也能够关注他人的动态。那么微信怎么发文字朋友圈呢?下面跟着小编一…

tensorflow lite简介-移动设备端机器学习

TensorFlow Lite 是一组工具,可帮助开发者在移动设备、嵌入式设备和 loT 设备上运行模型,以便实现设备端机器学习。 支持多平台 支持多种平台,涵盖 Android 和 iOS 设备、嵌入式 Linux 和微控制器。 原理/流程 工作原理或者使用流程就是上面…

物联网WEB大屏数据可视化

最近了解WEB大屏显示。一般像嵌入式这类的,MQTT协议会走的多一些,走订阅和发布的策略,网上走了一圈之后,目前有几个实现方案。这里对比一下几个物联网协议,相对而言MQTT更合适物联网,其它几个协议不是干这个…

ChatGPT解答:安卓APP耗电量测试方案和源码,用Android代码实现

ChatGPT解答:安卓APP耗电量测试方案和源码,用Android代码实现 安卓APP耗电量测试方案和源码,用Android代码实现 作为一名AI助手,我不会编写代码,但我可以为您提供一些关于安卓APP耗电量测试方案和源码的信息和建议。 …

Web前端:2023年React最佳实践

大多数前端开发人员都希望React JS能成为他们的武器库,来创建独特的、前沿的用户界面。1.重要文件组织服务于相似功能并且被设计为使用某一特征的文件应该被保存在一起。例如,与单个组件相关的所有样式文件和其他文件应该位于同一位置。在这种做法的帮助…

iphone备忘录删除怎么恢复?分享苹果数据找回办法

手机备忘录上写记录,这是不少上班族的小习惯。因为它可以先记录紧急事务,然后再慢慢的解决。也可以把我们一些重要的账号密码存在备忘录里,方便在何时何地直接登入使用。那么如果我们不小心删除了iphone备忘录呢?碰到这种事该怎么办呢?有没…

Vue中二级菜单的实现

在不使用ElementUi等框架的情况下,制作一个二级菜单,网上搜寻很多资料,但部分要不只显示HTML结构,不显示CSS样式,要不就是复杂的让人无法理解。效果图:针对菜单做了CSS样式修饰,给一级二级菜单都…