展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > MySQL索引知识点分析

MySQL索引知识点分析

1索引的概念1.1定义索引在关系型数据库中,是一种单独的、物理的对数据库表中的一列或者多列值进行排序的一种存储结构,它是某个表中一列或者若干列值的集合,还有指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录重点页码快速找到所需要的内容,数据库使用索引以找到特定值,然后顺着指针找到包含该值的行,这样可以是对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。1.2类型在InnoDB里面,索引类型有三种,普通索引、唯一索引(主键索引是特殊的非空的唯一索引)、全文索

本文目录

      1索引的概念

      1.1定义

      索引在关系型数据库中,是一种单独的、物理的对数据库表中的一列或者多列值进行排序的一种存储结构,它是某个表中一列或者若干列值的集合,还有指向表中物理标识这些值的数据页的逻辑指针清单。
      索引的作用相当于图书的目录,可以根据目录重点页码快速找到所需要的内容,数据库使用索引以找到特定值,然后顺着指针找到包含该值的行,这样可以是对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

      1.2类型

      在InnoDB里面,索引类型有三种,普通索引、唯一索引(主键索引是特殊的非空的唯一索引)、全文索引。

      普通(Normal):也叫非唯一索引,是普通索引,没有任何限制。唯一(Unique):唯一索引要求键值不能重复(可以为空),主键索引其实是一种特殊的唯一索引,不过他还多了一个限制条件,要求键值不能为空。主键索引用 primary key 创建。全文(Fulltext):针对比较大的数据,比如我们存放是文章,课文,邮件,等等,有可能一个字段就需要几kb,如果要解决like查询在全文匹配的时候效率低下的问题,可以创建全文索引。只有文本类型的字段才可以创建全文索引,比如char、varchar、text。MyISAM和InnoDB都支持全文索引。

      1.3作用

      一句话总结:

      索引能够提高数据检索的效率,降低数据库的IO成本。

      提出问题:我们用空间换时间,但是他的数据结构、查询的IO成本、以及是如何存储数据的呢?

      2索引的数据结构B+树的演进过程

      我们以一个 Page 的视角去看我们的B+树演进过程。

      页是InnoDB管理存储空间的基本单位,InnoDB将数据库中的数据都是存储在页这个基本存储单位⾥的;页也是内存和磁盘交互的基本单位,数据库从磁盘中读取若⼲个页⼤⼩的数据到内存,也将内存中若⼲个页⼤⼩的数据刷新到磁盘中。
      ⼀个页的内存⼤⼩为16KB。

      假设我们要执行这个SQL,得到了10条记录:

      SELECT * FROM INNODB_USER LIMIT 0 , 10;

      假如一条记录的数据大小是4K,那么我们一个Page页能存多少条数据呢?

      16K 除以 4K 得到 4条记录,对吧。

      Page里面的每一条数据都有一个关键的属性叫做record_type
      0 普通用户记录 1 目录的索引记录 2 最小 3 最大

      画个图示例一下页里面数据是怎么放的:

      MySQL索引知识点分析

      这个是我们的Page页,每个Page页都会存放数据,按照主键有序存放数据

      我们知道数据的存储是顺序IO的,方便存放,可是存放方便那查询是不是就不方便了,如果查的是最后一个是不是要遍历整个页的数据?

      2.1问题

      假如我们要查一条数据要怎么查?怎么才能快速查到数据?

      • 如果我们Page页中的数据是有连接方式的,想想我们学过的数据结构,哪种结构查询快?

      • 如果我们Page页中的数据是有连接方式的,就能够解决啊!没错,就是链表

      Page页中的数据是怎么连接的(数据在同一个页中):

      MySQL把页中的数据通过单向链表连接起来,如果是根据主键去查询,使用二分法定位会非常快,如果是根据非主键索引去查,只能从最小的一个个开始遍历单向链表。

      多个Page页是怎么建立连接(数据在不同的页中):

      MySQL把不同的页通过双向向链表建立链接,这样我们就可以通过上一页找到下一页,通过下一页找到一页,由于我们现在不能快速定位到数据的所在页,我们只能从第一个页沿着双向链表一直往下找,在每个页中再按照在同一页的方式去查找指定的记录,这个也是全表扫描嘛。

      MySQL索引知识点分析

      2.2问题

      当Page页越来越多,查询会出现什么问题、怎么解决怎么优化?

      当我们链表记录变多,由于不能直接定位,我们出现了查询缓慢问题,深入思考,所谓的查询缓慢,其实就是下面两个问题:

      • 查询时间的复杂度0(N)

      • 读写磁盘的IO次数过多

      我们想一下,平时看书时,想找某一页的资料,怎么做的?
      查目录对不对?目录是个啥?不就是索引嘛!

      百度上随便找个目录,贴个图:

      MySQL索引知识点分析

      我们发现,这个目录里面有两个很重要的信息:

      • 内容简介(章节标题)

      • 所在的页码

      我们这个我们参考一个图书的目录的思想来达到我们快速查询数据的目的:

      给数据加一个目录,查数据,我们先根据目录页找到数据在哪个页的哪个地方,提升查询性能。

      可是,

      2.3问题:怎么建目录呢?给每一个页都建一个目录吗?

      建目录是不是要有规律?比如字典的目录就是根据字母顺序建立的,你想到了什么?没错就是主键,Mysql里自增的主键刚好符合我们的要求,有规律,内容还少,而且不可重复,真是完美的目录,我们将每一页的主键按规律存储一下,添加一个指针指向数据的位置,查询时直接根据主键大小,用二分法快速找到目录,然后找到数据。
      但是我们要给每一个数据页都建目录吗?好像还必须如此,不给每一个页建数据,你怎么定位到页里的数据?难道全页扫描吗?
      但是给每一个页都建目录,随着目录页也出现多个,我们一个个目录也去遍历查询性能也会下降。
      我们可不可以给目录建一个目录?
      于是,我们可以通过为目录页也建立一次目录,向上抽取一层根结点,这样就更加便于我们进行查询了。

      MySQL索引知识点分析

      这棵树,因为是根据主键存储的,所以我们把它称之为主键索引树,因为主键索引树里存储了我们的表里的所有数据,那么在MySQL中 索引即数据,数据即索引也是这个原因了。

      这就是MysqlB+树主键索引树的数据结构,怎么样,是不是比你直接死记硬背得到的知识印象更深刻

      2.4索引树、页的分裂与合并

      我们找到了提升查询性能的办法,那么,当Page页出现增加、修改、删除,都会遇到什么问题?

      如果是有序增加,新增一条数据怎么办?
      页写满了,那么是不是得开启一个新页!
      并且页的数据必须满足一个条件:下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值
      因为是有序增加,我们直接在页的双向链表末端增加一个页即可。
      那如果是无序增加,新增一条数据怎么办?

      • 开启一个新页,并且找到数据的位置。

      • 把旧数据移动到新页,把新的数据放到有序的位置上。

      • 叶子结点数据一直平移。

      • 触发叶子结点数据Page页的分裂与合并触发上层叶结点和根结点的再次分裂与合并。

      • 这叫什么,“牵一发而动全身”,也叫做页分裂!!

      总结:Page页出现增加、修改、删除遇到的问题:

      我们可以说,当无序增加、更新主键ID、删除索引页的更新操作时候,会有大量的树结点调整,触发子叶结点Page页和上层叶结点和根节点页的分页与合并,造成大量磁盘碎片,损耗数据库的性能,也就是解释了我们为什么不要在频繁更新修改的列上建索引,或者是不要去更新主键。

      让我们总结一下:

      聚集索引(聚簇索引):

      主键索引树也叫聚集索引或者是聚簇索引,在InnoDB中一张表只有一个聚集索引树,如果一张表创建了主键索引,那么这个主键索引就是聚集索引,我们是根据聚集索引树的键值,决定数据行的物理存储顺序,我们的聚集索引会对表中的所有列进行排序存储,索引即数据,数据即索引,指的就是我们的主键索引树啦。

      2.5根据我们刚才推演的,延申出几个面试题

      为什么主键ID最好是趋势递增的?

      你刚刚看完啊,不会没记住吧,有序递增,下一个数据页中用户记录的主键值必须大于上一个页中用户的主键值,假如我是趋势递增,存入的数据肯定是在最末尾链表或者新增一个链表,就不会触发页的分裂与合并,导致添加的速度变慢。

      三层B+数能存多少数据?

      考察点:Page页的大小,B+树的定义
      1GB = 1024 M, 1mb = 1024k,1k= 1024 bytes

      答:
      已知:索引逻辑单元 16bytes 字节,16KB=16* 1024*1024,肯定比一千万多,在InnoDB中B+树的深度为3层就能满足千万级别的数据存储。

      mysql 大字段为什么要拆分?

      一个Page页可存放16K的数据,大字段占用大量的存储空间,意味着一个Page页可存储的数据条数变少,那么就需要更多的页来存储,需要更多的Page,意味着树的深度会变高。那么磁盘IO的次数会增加,性能下降,查询更慢。大字段不管是否被使用都会存放在索引上,占据大量内存空间压缩Page数据条数。

      为什么用B+树?

      B+树的底层是多路平衡查找树,对于每一次的查询的都是从根节点触发,到子叶结点才存放数据,根节点和非叶子结点都是存放的索引指针,查找叶子结点互,可以根据键值数据查询。扫库、扫表能力更强排序能力更强查询效率和查询性能稳定存储能力更强、三层B+树就能存储千万级别的数据。

      3什么是二级索引树

      刚才看的是根据主键得来的索引,我们如果不查主键,或者说表里压根就没有主键,怎么办?我们还可以根据几个字段来创建联合索引(组合索引聚合索引。。哎呀名字而已怎么叫都行)。

      根据主键得到的索引树叫主键索引树,根据别的字段得到的索引树叫二级索引树。

      通过下面的SQL 可以建立一个组合索引

      ALTER TABLE INNODB_USER ADD INDEX
      SECOND_INDEX_AGE_USERNAME_PHONE('age','user_name','phone');

      其实,看似建立了1个索引,但是你使用 age 查询 age,user_name 查询 age,user_name,phone 都能生效
      您也可以认为建立了三个这样的索引:

      ALTER TABLE INNODB__USER ADD INDEX
      SECOND_INDEX_AGE__USERNAME_PHONE('age');
      ALTER TABLE INNODB_USER ADD INDEX
      SECOND_INDEX_AGE_USERNAME_PHONE('age','user_name');
      ALTER TABLE `INNODB_USER`ADD INDEX
      SECOND_INDEX_AGE_USERNAME_PHONE('age','user_name','phone');

      3.1那么二级索引树怎么排序?

      首先需要知道参与排序的字段类型是否有有序?

      如果是有序字段,就按照有序字段排序比如(int) 1 2 3 4。
      如果是无序字段,按照这个列的字符集的排序规则来排序,这点不去深入,知道就好。

      我现在有一个组合索引(A-B-C)他会按照你建立字段的顺序来进行排序:
      如果A相同按照B排序,如果B相同按照C排序,如果ABC全部相同,会按照聚集索引进行排序。

      我们的Page会根据组合索引的字段建立顺序来存储数据,年龄 用户名 手机号。
      它的数据结构其实是一样的

      3.2索引桥的概念是什么呢(最左匹配原则)?

      还是上面那个索引,年龄用户名手机号,age,username,phone
      那么可以看到我们第一个字段是AGE,如果需要这个索引生效,是不是在查询的时候需要先使用Age查询,然后如果还需要user_name,就使用user_name。

      只使用了user_name 能使用到索引吗?
      其实是不行的,因为我是先使用age进行排序的,你必须先命中age,再命中user_name,再命中phone,这个其实
      就是我们所说的最左匹配原则。

      最左其实就是因为我们是按照组合索引的顺序来存储的。大家常说的"索引桥"也是这个原因。命中组合索引必须是像过桥一样,必须现在从第一块木板走到第二块木板再走到第三块木板。

      3.3回表、覆盖索引、索引下推

      二级索引树有三个重要的概念,分别是回表、覆盖索引、索引下推。.

      回表就是:我们查询的数据不在二级索引树中需要拿到ID去主键索引树找的过程。

      覆盖索引就是:我们需要查询的数据都在二级索引树中,直接返回这种情况就叫做覆盖索引。
      索引下推(index condition pushdown )简称ICP:在Mysql5.6以后的版本上推出,用于优化回表查询;

      3.4延申几个面试题:

      为什么离散度低的列不走索引?

      离散度是什么概念?相同的数据越多离散度越低,相同的数据越少离散度就越高。
      请问都是相同的数据,怎么排序?没办法排序啊?
      在B+Tree 里面重复值太多,MySQL的优化器发现走索引跟使用全表扫描差不了多少的时候,就算建立了索引也不会走。走不走索引,是MySQL的优化器去决定的。

      索引是不是越多越好?

      空间上:用空间换时间,索引是需要占用磁盘空间的。
      时间上:命中索引,加快我们的查询效率,如果是更新删除,会导致页的分裂与合并,影响插入和更新语句的响应时间,反而延缓性能。
      如果是频繁需要更新的列,不建议建立索引,因为频繁触发页的分裂与合并。

      3.5二级索引树的总结

      也叫作组合索引(复合索引),二级索引树存储的是我们创建索引时候的保存了列名顺序来存储的,它只保存了创建二级索引列名的部分数据,二级索引树是为了辅助我们查询,提高查询效率诞生的,二级索引树里有三个动作:回表、覆盖索引、索引下推。其中,性能最高的是覆盖索引。

      4主键索引与二级索引的区别

      网上找了一张区别图

      MySQL索引知识点分析

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 MySQL
      相关文章 更多
      精品专题 更多
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      macOS软件

      正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

      IOS软件

      正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

      AI

      正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

      Mac软件 更多
      Postman macOS版
      Postman macOS版

      Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

      Docker Desktop macOS版
      Docker Desktop macOS版

      Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

      Android Studio macOS版
      Android Studio macOS版

      Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

      Xcode macOS版
      Xcode macOS版

      Xcode 是苹果面向 Mac 提供的官方集成开发环境,将代码编辑、项目构建、SwiftUI 实时预览、设备模拟、自动化测试、断点调试、性能分析和应用分发整合在同一套工作流中,适合开发与维护 iPhone、iPad、Mac、Apple Wa

      JetBrains WebStorm macOS版
      JetBrains WebStorm macOS版

      JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

      PhpStorm macOS版
      PhpStorm macOS版

      PhpStorm 是 JetBrains 推出的专业 PHP 集成开发环境,可在 Mac 上完成代码编写、智能检查、重构、调试、测试和数据库管理。它支持主流 PHP 框架、Composer、Git、Docker 与远程解释器。

      JetBrains PyCharm macOS版
      JetBrains PyCharm macOS版

      JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

      JetBrains IntelliJ IDEA macOS版
      JetBrains IntelliJ IDEA macOS版

      IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

      Visual Studio Code macOS版
      Visual Studio Code macOS版

      Visual Studio Code 是微软提供的免费代码编辑器,支持 macOS,并为 Intel 与 Apple 芯片 Mac 提供适配版本。软件集代码编辑、调试、Git 源代码管理、集成终端和扩展市场于一体。

      REAPER macOS版
      REAPER macOS版

      REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

      Adobe Audition macOS版
      Adobe Audition macOS版

      Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

      Pro Tools macOS版
      Pro Tools macOS版

      Pro Tools 是 Avid 推出的专业数字音频工作站,覆盖多轨录音、无损剪辑、MIDI 编曲、插件处理、自动化混音及声音与画面同步等工作。它拥有 Intro、Artist、Studio 和 Ultimate 等方案。

      WINDOWS 更多
      PixPix 网页版
      PixPix 网页版

      PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

      Postman Windows版
      Postman Windows版

      Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

      Docker Desktop Windows版
      Docker Desktop Windows版

      Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

      Android Studio Windows版
      Android Studio Windows版

      Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,

      JetBrains WebStorm Windows版
      JetBrains WebStorm Windows版

      WebStorm 是 JetBrains 面向 JavaScript、TypeScript 和现代 Web 技术打造的集成开发环境。它提供项目级代码分析、智能补全、安全重构、导航搜索,并集成调试、测试、终端、Git 与常用前端工具,

      JetBrains PhpStorm Windows版
      JetBrains PhpStorm Windows版

      PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

      JetBrains PyCharm Windows版
      JetBrains PyCharm Windows版

      PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,

      JetBrains IntelliJ IDEA Windows版
      JetBrains IntelliJ IDEA Windows版

      JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

      Visual Studio Code Windows版
      Visual Studio Code Windows版

      Visual Studio Code 是微软推出的免费代码编辑器,Windows 版集成智能补全、代码导航、调试、终端和版本控制,并可通过扩展添加语言、格式化及远程开发能力。它启动较快、配置灵活,

      REAPER Windows版
      REAPER Windows版

      REAPER 是 Cockos 推出的数字音频工作站,适用于录音、MIDI 编曲、音频编辑、混音、母带制作及声音设计。软件安装包小巧,支持多轨录制、灵活路由、自动化、第三方插件和脚本扩展,并提供完整功能的 60 天免费评估期。

      Adobe Audition Windows版
      Adobe Audition Windows版

      Adobe Audition 是面向播客、影视后期、广播与音乐制作的专业音频工作站,提供波形编辑、多轨混音、频谱分析、录音、降噪修复和效果处理等功能。Windows 版通过 Adobe Creative Cloud 安装和管理,

      Pro Tools Windows版
      Pro Tools Windows版

      Pro Tools 是 Avid 推出的专业数字音频工作站,提供多轨录音、音频剪辑、MIDI编曲、插件处理、自动化混音及影视声音制作能力。它适合音乐人、录音师、制作人和音频后期团队使用,并提供免费入门版、订阅方案及永久授权选择。