MySQL索引理解

news2025/3/1 3:31:41

目录

什么是索引?

索引的好处

思考一个小问题, 索引这么好, 那是不是越多越好?

索引分类

索引的创建和删除

explain字段解释

索引底层数据结构

区分MyISAM和InnoDB存储引擎来再认知聚簇非聚簇索引


什么是索引?

  • 索引: 类似于目录的帮助快速检索数据的一种数据结构. 辅助结构. 从小最早接触到索引在哪里?  门牌号, 新华字典的目录。。。根据目录(索引) 快速检索data.
  • 在MySQL的存储引擎中, 索引大多采取的是索引B+树作为底层数据结构来实现的. 
  • 当然也存在hash索引. 自适应hash. 根据实际情况而定. 
  • 索引要起到快速检索的效果,必然存在数据组织结构特性. 字典都是按照一定的结构所组织数据的. 所以具体怎么检索,我们需要对底层数据结构具备相当的理解

索引的好处

  • 索引的核心好处就是加速查找速率, 达到快速检索数据的功能.
  • 思考一个小问题, 索引这么好, 那是不是越多越好?

首先,不是所有的场景都适合加索引, 索引主要在于他快速查找的优势.

其次,我们维护索引肯定是需要花费空间+时间上的代价的.

  • 空间上:  存在单独的索引文件+数据文件 (MyISAM存储引擎) || 索引+数据存储在一起的文件(Innodb存储引擎)
  • 时间上:插入数据删除数据对数据进行update的操作都需要额外的维护索引结构(跟新索引文件)索引文件在磁盘上
  • 索引文件的改动需要进行磁盘IO操作. 过多的磁盘IO操作会增大CPU的负担

引分类

  • 物理结构层面上:聚集索引(索引+数据聚集在一起)+非聚集索引(索引跟数据不聚集在一起)
  • 数量上:单例索引+多列索引 (最左前缀匹配原则, 左边第一列必须先使用, 联合索引才有用)
  • 唯一索引: unique index,不可重复,但可为NULL
  • 主键索引: 用primary key 修饰, 不为空的唯一索引
  • 普通索引: 没有上述限制,可以为空,允许重复.

索引的创建和删除

  • create [unique] index 索引名字 on 表(字段名(字段长度))
  • drop index 索引名字 on 表名
  • explain query sql : explain 关键字, 获取sql命令的执行计划, 分析慢查询sql语句,为其添加索引.

eg:  尝试一个简单的索引使用:

上述是我的一个表结构, 现在我要查询一下王五:  我可以查询id = 3 or 直接查询王五.

1. 查询id = 3

2. 查询name='王五'

 对比之下发现猫腻没有:  直接查主键索引id = 3 检索了一行找到结果, 检索没有索引的name=王五. 直接来了个全表查询。 查询了四行记录.

 给name字段加上索引再检索查看效果

也变得检索一行了。

explain字段解释

  • select_type:  查询语句的类型, simple简单查询语句,不包含嵌套查询. 其他类型都是嵌套查询或者联表查询
  • table: 表名
  • type: const用于主键或者唯一索引的等值查询。 ref常见于辅助索引的等值查找     ALL全表搜索
  • Extra: using index,查询的时候不需要进行回表查询, 直接通过索引可以获得数据

索引底层数据结构

上述这句话是索引底层数据结构选取B+树的关键.

  • 第一,  明确一个结点就需要进行一次磁盘IO操作
  • 第二,查询到结果的速度主要在于树高,在于路劲上的结点数目. 

查询data过程:首先加载根部结点到内存. 建立索引B+树,根据结点信息加载下一个结点所在的磁盘块到内存,不断向下检索。最终到达叶子结点 (分存储引擎,存储的是实际记录信息所在的磁盘地址,或者就是实际的数据记录) 

  • 磁盘块大小: 16k, 4*pagesize. 也就是4个存储页.   (也就是B+树结点设置大小)
  • 上述是为了磁盘IO的次数最少. 磁盘IO才是MySQL读写效率的关键.

hash表:  仅仅只能做等值查询, 也就是查询确切的一个值,不能查询一个区间range. 如果需要range查询就会退化为全表扫描的方式.           

且数据key值局限性大,不能出现大量的(冲突),如果出现key大量的冲突,还需要resize扩容. 扩容转移数据代价也比较高. (面试考点, 可不可以不转移数据,两个hash表共用? 一致性hash)

key: 存储索引列, Value存储行记录或者行记录所在磁盘地址.

搜索树: AVL树, 红黑树. 二路分叉 树高都不太理想,容易出现廋高现象。磁盘IO次数还是不少.

B树: 多路分叉. 左树 < 结点 < 右树 (多路分叉使得树高进一步降低.)  

B+树:B树基础上做出优化, 数据全部都存储在叶子结点上, 且前面的非叶子结点均只存储索引。这样,上面的结点不存储实际的记录,可以存储更多的索引,进一步降低树高. 减少磁盘IO次数,而且叶子结点的数据按照key值有序性用双向链表做串联. 易于快速进行range查询操作。

B树

B+树

区分MyISAM和InnoDB存储引擎来再认知聚簇非聚簇索引

MyISAM引擎使用B+树作为索引结构,叶节点的data域存放的是数据记录的地址

对于MyISAM而言, 主键索引和其他的二次索引结构式一毛一样的。data存储的也是记录的磁盘地址. 唯一一点不一样,就是辅助索引允许key值重复, 但是主键索引唯一.

故而,MyISAM存储引擎。索引+数据分开存储在两个不同的磁盘文件当中.

例如一个user 表,会在磁盘上存储三个文件 user.frm(表结构文件) user.MYD(表的数据文件) user.MYI(表的 索引文件)。  .MYD:data数据文件,.MYI: index索引文件

Innodb存储引擎而言,将索引+数据放入到一个文件中. 

 student.ibd: index + data文件, 索引加数据放在一起的文件。 frm表结构的文件.

对于Innodb主键索引:也就是所谓的聚集索引,看吧,为啥叫做聚集,索引和数据聚集在一块的。数据在最下面叶子连在一块,此为之聚集.

Innodb下的非聚集索引: 辅助索引, 二次索引. 

最下面叶子结点记录的是主键值, 也就是聚簇索引B+树的key值。如果需要获取更多的额外的data信息,在辅助索引B+树上找不全,就需要再回表查询,查主键索引B+树,耗费更多的磁盘IO.

看到这里. 小杰想跟兄弟们推荐一篇知乎上火爆的关于索引的文章, 检验一下自己,看看索引过关了不,学无止尽,反复思考,领略概念,企图更加深入。

我以为我对Mysql索引很了解,直到我遇到了阿里的面试官-HollisChuang's Blog

最后小杰浅谈文中几个问题:

如何引入索引? 从慢查询+explain看sql执行计划来分析加索引入手

索引底层数据结构?可能衍生到hash table 与 搜索树 与 B+树的区别和优劣

B+ Tree的叶子节点都可以存哪些东西? data + key

覆盖索引是啥?不要回表查询

联合索引、最左前缀匹配?

我们把识别度最高的字段放到最前面, 最常见的,点击量最高的列放在左边,越左,优先级越高:

如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。

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

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

相关文章

Dragonfly 中 P2P 传输协议优化

文&#xff5c;孙珩珂 上海交通大学 本文1987字 阅读 10 分钟 01 优化背景 此前 Dragonfly 的 P2P 下载采用静态限流策略&#xff0c;相关配置项在 dfget.yaml 配置文件中&#xff1a; # 下载服务选项。 download: # 总下载限速。 totalRateLimit: 1024Mi # 单个任务…

Java-IO流学习

文章目录前言1.Java-IO流简介2.流的基本概念3.创建文件的三种方式3.1根据一个文件路径直接创建一个文件。3.2 根据父目录 File 对象&#xff0c;在子路径创建一个文件3.3 根据父目录路径&#xff0c;在子路径下生成文件4.获取文件信息5.目录与文件操作5.1文件删除5.2目录删除5.…

【Linux】实验二 Makefile 的编写及应用

静态和动态库的转换可以参考这篇文章哦&#xff01;&#xff01; 文章目录实验二 Makefile 的编写及应用实验目的实验内容具体步骤&#xff1a;一、进入文件夹二、生成各个.c .h文件1. exam.h2. exam.c3. mat.h4. mat.c5. main.c三、编译建立的文件1. 只编译不链接 main.o2. 使…

Vue实现任意内容展开 / 收起功能组件

博主介绍 &#x1f4e2;点击下列内容可跳转对应的界面&#xff0c;查看更多精彩内容&#xff01; &#x1f34e;主页&#xff1a;水香木鱼 &#x1f34d;专栏&#xff1a;后台管理系统 文章目录 简介&#xff1a;这是一篇有关【Vue实现任意内容展开 / 收起功能组件】的文章&am…

1.jdk,数据类型,运算符

Java语言跨平台性的解释 一次编译&#xff0c;到处运行 将.java文件编译成.class文件&#xff0c;然后就可以在linux&#xff0c;windows运行。 java的跨平台的实现是通过在不同的操作系统上的不同的jvm差异来实现跨平台的 jdk jdk jre&#xff08;jvmjavase核心类库&…

MySQL基础操作总结_CRUD

文章目录 1.新增 insert 1.1 单行数据全列插入 1.2 多行数据指定列插入 2.查询 select 2.1 全列查询 2.2 指定列查询 2.3 查询字段包含表达式 2.4 别名 2.5 去重:distinct 2.6 排序:order by 2.7 条件查询 2.7.1 where条件查询 2.7.2 and与or查询 2.7.3 范围查…

Java简介

Java是一门面向对象的编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向对象理论&#xff0…

Matplotlib 基础入门知识点总结

目录 1、绘图的一些基本命令展示 2、Matplotlib 绘制网格 3、plt.gca() 对坐标轴的操作 4、 图表的样式参数设计 5、创建图形对象 6、绘制多子图 1.add_axes()&#xff1a;添加区域 2. subplot()函数&#xff0c;可以均等的划分画布 3.subplots()函数详解 7、柱形图的…

踩坑List.addAll抛出UnsupportedOperationException

转载标明出处: 公司内部博客,作者 居xx, 在此表示感谢 1、我自己遇到的问题 try { // 不加try..catch报错 java.lang.UnsupportedOperationException: null ,原因未知list.addAll(a.getResult());list.addAll(b.getResult());list.addAll(c.getResult());list.addAll(d.getResu…

双软认证是指哪两项证书认证

一、双软认证是指哪两项证书认证&#xff1a; “双软认证”&#xff1a;指软件产品等登记和软件企业认定&#xff1b;企业申请双软认证&#xff0c;除了获得软件企业和软件产品的认证资格外&#xff0c;也可以使企业享受国家对软件行业提供的税收优惠政策。 二、认证的好处 1、…

后量子密码学中的模数是多少?

密码学&#xff1a;后量子密码学中的模数是多少&#xff1f; 只要是从事网络安全或安全软件开发的人&#xff0c;就都可能已经了解过公钥加密以及在20世纪70年代末和80年代前后创建的方法。现在我们可能需要学习更多的理论&#xff0c;因为我们所学的方法可能会受到量子计算机的…

网页字体图标用法

目录前言引用流程1、打开网页2、选择自己喜欢的图标加入购物车3、下载图标4、引用引用前言 1、接下来介绍引用图标都是免费的&#xff0c;可以放心食用。 2、标签可以自己设计&#xff0c;用css、svg画图或者引用图片都可以。但我们设计的很难超过专业人员的设计。引用图片的画…

深入理解mvcc机制(详解)

深入理解mvcc机制一&#xff0c;MVCC定义1&#xff0c;undolog日志2&#xff0c;undolog版本控制链3&#xff0c;readView3.1&#xff0c;readview简介3.2&#xff0c;readview和undolog结合使用规则3.3&#xff0c;readview和undolog基本使用4&#xff0c;总结一&#xff0c;M…

Java学习----前端3

今日学习内容如下&#xff1a; JavaScript JavaScript是一种基于对象和事件驱动的客户端脚本语言动态、弱类型、基于原型&#xff0c;内置了支持类 解释器称为 JS 引擎&#xff0c;内置于浏览器中 ECMA 欧洲计算机制造商协会Hello world <input type"button" on…

与git相关错误的究极解决方案

没有科学上网导致的git推送和拉取错误&#xff0c;严重阻碍了搬砖进度&#xff0c;遇到的与git有关的错误&#xff1a; 1. gnutls_handshake() failed: The TLS connection was non-properly terminated. 2. Failed to connect to github.com port 443:connection timed out …

Postman 如何获取请求结果并设置到请求头中

目录1.设置环境变量2.获取token&#xff0c;并赋值给环境变量3.将环境变量添加到请求头Postman&#xff1a; 是一款用于接口调试和测试的开发工具&#xff0c;功能强大&#xff0c;使用简单。 无论是开发人员进行接口调试&#xff0c;还是测试人员做接口测试&#xff0c;Postma…

本地生活小程序有什么功能_本地生活小程序的优势

对于平台运营方 痛点&#xff1a;社区团购毛利偏低 零售行业竞争激烈&#xff0c;单纯依靠社区团购卖货整体毛利率较低 手中大量用户&#xff0c;缺少好的变现模式&#xff0c;迫切需要提升盈利能力。 优势&#xff1a;提升盈利&#xff0c;解决流量变现 本地生活属于轻资产…

8Manage:千万别忽视了供应商绩效管理

供应商绩效管理是采购管理流程中的一部分&#xff0c;现代企业几乎都会对供应商实行绩效考核。绩效管理的主要目的是了解供应商的表现、促进供应商改进&#xff0c;并为工业商奖励、供应商优化提供依据&#xff0c;以此来发现优质的供应商&#xff0c;及时改进不合格的供应商。…

Python控制自己的手机摄像头拍照,并把照片自动发送到邮箱

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 今天这个案例&#xff0c;就是控制自己的摄像头拍照&#xff0c; 并且把拍下来的照片&#xff0c;通过邮件发到自己的邮箱里。 想完成今天的这个案例&#xff0c;只要记住一个重点&#xff1a;你…

CSDN的MD编辑器【写作技巧】

CSDN的MD编辑器【写作技巧】在线LaTeX公式的编辑器快捷键&#xff0c;结合快捷键提高效率写作技巧在线LaTeX公式的编辑器 推荐去https://www.latexlive.com/在线LaTeX公式编辑器 将写好的公式代码复制过来。 然后复制在CSDN编辑器里面前后加上符合$就行了 前后加两个该符合就会…