MySQL知识点总结(一)——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推

本文主要是介绍MySQL知识点总结(一)——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MySQL知识点总结(一)——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推

  • 一条SQL的执行过程
  • 索引底层数据结构
    • 为什么不使用二叉树?
    • 为什么不使用红黑树?
    • 为什么不使用hash表?
    • 为什么不使用b-tree?
  • 一级索引和二级索引
  • 索引失效
  • 索引覆盖
  • 索引下推

一条SQL的执行过程

在这里插入图片描述

  • 客户端:用于向服务端发起sql查询或更新请求,MySQL自带的命令行客户端、MySQL的JDBC客户端等都是。
  • 连接器:用于接收客户端的连接,并进行身份认证、查询当前账号拥有的权限。
  • 查询缓存:MySQL服务端会将一条SQL的查询结果缓存缓存起来,下一次再执行相同的sql时,就可以直接从缓存中取。但是一旦对应的库表发生了更新,缓存将会被清空,因此只适用于更新频率不高的场景,MySQL8.0以上的版本已经将其去除。
  • 分析器:对SQL进行词法分析和语法发现,就是分析我们的这个SQL要干啥。
  • 优化器:对我们的SQL进行优化,选取使用的索引,生成执行计划。
  • 执行器:调用执行引擎的接口进行SQL查询或更新。

索引底层数据结构

MySQL索引的底层数据结构是B+树。

在这里插入图片描述

B+树是多路平衡树(B-tree)的一个变种,非叶子节点只存放主键和到下一级节点的指针,叶子节点存放主键和主键对应的数据行记录,叶子节点通过指针进行连接,形成一个双向链表,还有一个头指针和尾指针分别指向链表头节点和尾节点。在MySQL的b+tree中,一个索引页是16KB。

为什么不使用二叉树?

首先我们要明白一点,MySQL中的索引页是存储在磁盘中的,每次读取一个索引页,都是一次磁盘读取,会有磁盘寻址的开销,因此MySQL应该选取一种数据结构,可以让它尽量少的去读取磁盘,才适合作为存储索引的数据结构。

因为二叉树每个节点只有两个出路,树高较高,而B+树是多路平衡树,每个节点有多个出路,树高较矮,这意味着如果用二叉树作为索引的数据结构的话,磁盘寻址的次数会比使用B+树时多,性能不如B+树。

并且,在极端情况下,二叉树会退化成链表,比如id等于1、2、3、4、5、6、7的七条数据按顺序插入,最终二叉树的结果就变成了下图这个样子。

在这里插入图片描述

为什么不使用红黑树?

红黑树解决了二叉树极端情况退化成链表的问题,但是它没有解决树高较高的问题,因为红黑树也是一个二叉树的数据结构。

在这里插入图片描述

为什么不使用hash表?

hash表在插入和等值查询时非常快,可以做到O(1)的时间复杂度。但是hash表的原理是通过hash函数根据key算出一个hash值,然后通过hash值与hash表中的数组长度取模后,进行散列存储的,数据之间不存在顺序性,因此做索引范围查询时需要进行全表扫描,性能是比较低的。

在这里插入图片描述
而B+树是按顺序排好序的,并且索引页之间有双向指针,还有头指针和尾指针,范围查询非常方便。

为什么不使用b-tree?

B树是多路平衡树,分叉比二叉树和红黑树多,因此树高会比二叉树和红黑树矮。但是B树的非叶子节点也存放数据,而MySQL的索引页又固定是16KB,因此节点分叉较B+树少,树高比B+树高。此外,B树的叶子节点是没有双向链表连接的,因此范围查询的性能不如B+树。

在这里插入图片描述

一级索引和二级索引

一级索引也叫主键索引,是以主键作为索引键的索引,在B+树中通过主键进行排序。
在这里插入图片描述
二级索引是非主键索引,是以非主键的字段作为索引键进行排序,比如我们以上面的表为例,在age字段上建立一个二级索引,则效果如下图。

在这里插入图片描述

二级节点的叶子节点不存储行记录,而是存储索引建(age字段)和主键(id),当通过二级索引进行搜索时,会先从二级索引找到对应的主键,再通过主键在一级索引中进行查找,这个过程叫做回表。比如我们要通过二级索引查找age=60的这一条数据,则整个过程如下。

在这里插入图片描述

这个回表的过程是有性能开销的,如果MySQL判断走二级索引的代价比较大,不如全表扫描,就会放弃二级索引进行全表扫描。回表一般是因为我们建立二级索引时只包含一个索引键,没有包含要查询的其他字段,如果我们建立二级索引时,连同其他需要查询返回的字段一起建立一个二级联合索引,使得需要查询返回的字段在二级索引叶子节点中都有,MySQL就不会回表,这时候二级索引一般都会生效。

索引失效

索引失效是指由于SQL语句编写不规范(或其他原因)导致MySQL不走已经建立的索引进行查询,以下几种情况都会造成索引失效。

在这里插入图片描述

索引覆盖

索引覆盖是一种优化二级索引回表查询的手段,在建立索引时,原先的索引键连同最终需要查询返回的字段一起组成一个联合索引。这样,MySQL通过二级索引进行查询时,发现二级索引的叶子节点已经包含了所有需要查询返回的字段,就不会再回表查询,这样查询性能就会大大提高,原本由于大量回表而导致二级索引失效,通过这种优化手段,会使得MySQL会选择这个二级索引进行查询。

在这里插入图片描述

索引下推

在老版本的MySQL中,如果联合索引查询使用了范围查询,会使得联合索引中范围查询的字段的后续字段失效。比如我们有一张t_user表,有四个字段:“id(主键)、name、age、phone”。现在我们有一个sql:“select name, age, phone, where name like ‘黄%’ and age > 20;”。我们建立了一个联合索引(name,age),如果MySQL查询走了这个索引,那么MySQL5.6以前的版本是这样的:

在这里插入图片描述

新版本(5.6之后)的MySQL则通过索引下推进行优化,MySQL在通过二级索引中的name字段进行模糊匹配查询后,会利用二级索引中的第二个字段age进行条件判断来做进一步的筛选过滤,过滤掉不满足“age > 20”这个条件的id,这样可以减少回表的次数提升查询性能。

在这里插入图片描述

这篇关于MySQL知识点总结(一)——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/655323

相关文章

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

《SpringBoot整合kaptcha验证码过程(复制粘贴即可用)》本文介绍了如何在SpringBoot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页... 目录SpringBoot整合kaptcha验证码程序目录参考有两种方式在springboot中使用k

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql