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

mysql 10 单表访问方法

01.优化的过程

对于我们这些 MySQL 的使用者来说, MySQL 其实就是一个软件,平时用的最多的就是查询功能。DBA时不时丢过来一些慢查询语句让优化,我们如果连查询是怎么执行的都不清楚还优化个毛线,所以是时候掌握真正的技术了。我们在第一章的时候就曾说过, MySQL Server 有一个称为 查询优化器 的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的 执行计划 ,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。

1.2 举个例子

在这里插入图片描述02.查询有两种方式:

回到 MySQL 中来,我们平时所写的那些查询语句本质上只是一种声明式的语法,只是告诉 MySQL 我们要获取的数据符合哪些规则,至于 MySQL 背地里是怎么把查询结果搞出来的那是 MySQL 自己的事儿。对于单个表的查询来说,设计MySQL的大叔把查询的执行方式大致分为下边两种:在这里插入图片描述
设计 MySQL 的大叔把 MySQL 执行查询语句的方式称之为 访问方法 或者 访问类型 。同一个查询语句可能可以使用多种不同的访问方法来执行,虽然最后的查询结果都是一样的,但是执行的时间可能差老鼻子远了,就像是从钟楼到大雁塔,你可以坐火箭去,也可以坐飞机去,当然也可以坐乌龟去。下边细细道来各种 访问方法 的具体内容。

2.1 const

2.1.1 主键查询

在这里插入图片描述
原谅我把聚簇索引对应的复杂的 B+ 树结构搞了一个极度精简版,为了突出重点,我们忽略掉了 页 的结构,直接把所有的叶子节点的记录都放在一起展示,而且记录中只展示我们关心的索引列,对于 single_table 表的聚簇索引来说,展示的就是 id 列。我们想突出的重点就是: B+ 树叶子节点中的记录是按照索引列排序的,对于的聚簇索引来说,它对应的 B+ 树叶子节点中的记录就是按照 id 列排序的。

2.1.2 唯一二级索引

B+ 树本来就是一个矮矮的大胖子,所以这样根据主键值定位一条记录的速度贼快。类似的,我们根据唯一二级索引列来定位一条记录的速度也是贼快的,比如下边这个查询:在这里插入图片描述
在这里插入图片描述
可以看到这个查询的执行分两步,第一步先从 idx_key2 对应的 B+ 树索引中根据 key2 列与常数的等值比较条件定位到一条二级索引记录,然后再根据该记录的 id 值到聚簇索引中获取到完整的用户记录。设计 MySQL 的大叔认为通过主键或者唯一二级索引列与常数的等值比较来定位一条记录是像坐火箭一样快的,所以他们把这种通过主键或者唯一二级索引列来定位一条记录的访问方法定义为: const ,意思是常数级别的,代价是可以忽略不计的。

2.2 ref

有时候我们对某个普通的二级索引列与常数进行等值比较,比如这样:

对于这个查询,我们当然可以选择全表扫描来逐一对比搜索条件是否满足要求,我们也可以先使用二级索引找到对应记录的 id 值,然后再回表到聚簇索引中查找完整的用户记录。由于普通二级索引并不限制索引列值的唯一性,所以可能找到多条对应的记录,也就是说使用二级索引来执行查询的代价取决于等值匹配到的二级索引记录条数。

如果匹配的记录较少,则回表的代价还是比较低的,所以 MySQL 可能选择使用索引而不是全表扫描的方式来执行查询。设计 MySQL 的大叔就把这种搜索条件为二级索引列与常数等值比较,采用二级索引来执行查询的访问方法称为: ref 。我们看一下采用 ref 访问方法执行查询的图示:

在这里插入图片描述
从图示中可以看出,对于普通的二级索引来说,通过索引列进行等值比较后可能匹配到多条连续的记录,而不是像主键或者唯一二级索引那样最多只能匹配1条记录,所以这种 ref 访问方法比 const 差了那么一丢丢,但是在二级索引等值比较时匹配的记录数较少时的效率还是很高的。

在这里插入图片描述
2.3 ref_or_null

有时候我们不仅想找出某个二级索引列的值等于某个常数的记录,还想把该列的值为 NULL 的记录也找出来,就像下边这个查询:

SELECT * FROM single_demo WHERE key1 = 'abc' OR key1 IS NULL;

当使用二级索引而不是全表扫描的方式执行该查询时,这种类型的查询使用的访问方法就称为
ref_or_null ,这个 ref_or_null 访问方法的执行过程如下:在这里插入图片描述

可以看到,上边的查询相当于先分别从 idx_key1 索引对应的 B+ 树中找出 key1 IS NULL 和 key1 = ‘abc’ 的两个连续的记录范围,然后根据这些二级索引记录中的 id 值再回表查找完整的用户记录。

2.4 range
在这里插入图片描述

在这里插入图片描述
2.5 index
在这里插入图片描述
2.6 重温 二级索引 + 回表
在这里插入图片描述
2.7 明确range访问方法使用的范围区间
在这里插入图片描述
2.7.1 所有搜索条件都可以使用某个索引的情况在这里插入图片描述
也就是说上边这个查询使用 idx_key2 的范围区间就是 (100, +∞) 。

2.7.2 有的搜索条件无法使用索引的情况
在这里插入图片描述
在这里插入图片描述
2.7.3复杂搜索条件下找出范围匹配的区间
在这里插入图片描述
在这里插入图片描述
3.0 索引合并
我们前边说过 MySQL 在一般情况下执行一个查询时最多只会用到单个二级索引,但不是还有特殊情况么,在这些特殊情况下也可能在一个查询中使用到多个二级索引,设计 MySQL 的大叔把这种使用到多个索引来完成一次查询的执行方法称之为: index merge ,具体的索引合并算法有下边三种。

3.1 AND Intersection合并

在这里插入图片描述
在这里插入图片描述
什么时候使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 OR Union合并
在这里插入图片描述
在这里插入图片描述
3.3 Sort-Union合并在这里插入图片描述
在这里插入图片描述


http://www.mrgr.cn/news/54118.html

相关文章:

  • FreeRTOS基于汇编语言理解堆的概念,栈的概念(函数调用,局部变量,FreeRTOS如何使用栈)
  • Unity中面试遇到的问题--C#--dynamic
  • 机器学习方向在算法优化上有哪些创新点?
  • AI大模型是否有助于攻克重大疾病?
  • Code Review Item
  • 暴雨亮相第四届岩土力学与工程青年科学家论坛
  • Java 数据基本类型详解(各基本数据类型及其大小、数据类型转换、数据溢出问题、自动装箱与拆箱的影响)
  • 架构师之路-学渣到学霸历程-23
  • 理解C#中空值条件运算符及空值检查简化
  • 十五、Python基础语法(list(列表)-上)
  • AI写作助手系统盈利模式分析:打造盈利的AI网站
  • 可能要招1000+应届生!直击美团心动岗位 - 美团面试原题 - 贪心算法题如何用 go 和 C++ 解决
  • 【CSAPP】【答案/解析】《深入理解计算机系统》实验一/datalab-handout实验
  • 记录迷茫!
  • 【运维基础知识】《Linux 系统架构与文件系统及权限管理全解析》
  • java反射介绍
  • Kubernetes运行 Llama3
  • ntfs MFT损坏(ntfs文件系统故障)导致oracle异常恢复---惜分飞
  • 使用Version Catalog在项目之间共享版本
  • target_include_directories是如何组织头文件的?
  • Android开发相关的重要网站
  • 《数字图像处理基础》学习02-BMP位图文件
  • 浅析DDR
  • 【C++】类的默认成员函数:深入剖析与应用(上)
  • 编码方式知识整理【ASCII、Unicode和UTF-8】
  • 【C语言】文件操作(1)(文件打开关闭和顺序读写函数的万字笔记)