首页 > 数据库 ><<Mysql是怎样运行的>>小记-2

<<Mysql是怎样运行的>>小记-2

时间:2023-10-23 23:55:05浏览次数:46  
标签:index 索引 扫描 查询 访问 方法 小记

第十章:单表访问方法

Mysql Server中又有一个叫优化器的模块,在Mysql服务端对一条查询语句进行语法解析之后,会将其再交给优化器来进行优化,在优化后会获得一个执行计划.
这个执行计划中表明了应该使用哪些索引查询,还有表之间的连接顺序等等.
最后会按照该执行计划中的步骤调用存储引擎提供的接口来真正的进行查询.

访问方法的概念

我们写的SQL查询语句只是告诉了MYSQL要查询出的数据要符合哪些规则,并不是限制了Mysql查询数据的方式.
同一个SQL查询语句,可能有多种获取到目标数据的方法,我们称这些方法为访问方法或是访问类型.虽然结果一样,但是不同的访问方法执行起来效率可能差距甚大.

接下来就来介绍一下各种访问方法

const

const访问方法指直接通过聚簇索引或是唯一二级索引直接定位到一条数据,意为常数级别,代价可以忽略不计.
不过该方法需要聚簇索引的主键值和唯一二级索引的主键值与某想查询的常数相等才能有效.如果某个唯一索引主键是多个列,需要该多个列都有指定的值才能有效.
如果是为NULL的情况下则const访问方法无效,因为可能查询到多条数据.

ref

当使用某个二级索引列与常数进行等值比较,ref访问方法就会有效.
select * from t where index='111'
搜索条件为二级索引列与常数进行等值比较,并且形成的扫描区间为单点区间,就比如[111,111].这种访问方法称为ref.
我们要注意:

  • 使用二级索引来进行查询,并不是查询完所有的数据再进行统一回表,而是查询到一条就进行一次回表.
  • 如果采用比较的列可以为NULL, 并且我们即使使用唯一索引来进行查询,使用 is NULL 作为条件,最多也只能使用ref访问方法,因为可能查询到多条数据
  • 对于联合索引来说,只要用于比较的是从左到右连续的索引列与常数比较,就可以使用ref访问方法.

ref_or_null

当使用某二级索引查询索引列与某常数相同的同时,还查询该索引列值为NULL的时候,使用的就是ref_or_null访问方法
select * from t where index='111' and index is NULL
扫描区间为[NULL,NULL]和[111,111]

range

之前的访问方法都是索引列与某常数值等值时有效的.
而range是:当使用某个索引执行查询时,形成的扫描区间为若干个单点扫描区或是范围扫描区,则为为range访问方法.
select * from t where index='111' OR (index>=30 AND index <=50)
注意:扫描区间只有一个单点扫描区或是扫描区为(-∞,+∞)时都不为range访问方法.

index

当查询的列都包含在某一索引中充当索引列,并且条件也在该索引列中,就会使用index访问方法
select part1,part2,part3 from t where part2='abc'
就比如这个查询语句,我们假设这个表有一个联合索引(part1,part2,part3).
虽然条件中的列并不是连续的,无法利用索引快速查询.
这个时候由于查询的列都在索引列中,所以不需要进行回表操作,而查询条件又在该索引列中.
所以只需要遍历该联合索引的全部记录,而后对条件进行判断即可.我们称这种访问方法为index

因为联合索引列中的记录大小比聚簇索引的小,所以这种方式成本会小很多.

注意:如果全表扫描的语句使用了ORDER BY 主键的语句,该语句也会被认为是index访问方法.

all

直接通过聚簇索引对全表的记录进行扫描,这种我们成为all访问方法.

标签:index,索引,扫描,查询,访问,方法,小记
From: https://www.cnblogs.com/youjunhui/p/17783602.html

相关文章

  • 小记-忙不应该成为做不好某件事的借口
    我越来越忙了,领导选择把很多重要的事都放在我身上但是我以此为借口,经常偷闲,没有好好为自己的kpi忙碌,很有可能导致年终奖不理想,甚至可能导致职级晋升出问题,以后应分清主次。另,今天在向没给我提供重要资料的技服人员发脾气之后深有感触。工作,大可不必如此伤神动气。在恋爱中,不应......
  • 10.18 模拟赛小记
    这下真的寄了。赛前多校联测2。胜利一中出题。比赛链接。官方题解。A.谁共一杯芳酒赛时写了个小范围的爆搜和假的贪心。赛后一想笑的我。好好好。有的样例。给了和没给有什么区别啊。真无语。正确的思路是先按照一边端点为关键字排序,另一边按照最长不下降序列处理。这......
  • SpringBoot 注解小记
    用于入口类的注解SpringBootApplication标识该类是入口ComponentScan表示扫描入口类同级和所有子包下的Component我们也可以使用ComponentScan("Com.XXXX")自定义扫描路径用于类的注解@Component,@Service,@Repository,@Controller四个注解用于类上,后三个实质上都是Compon......
  • 「Log」2023.10.17 小记
    CSP第二轮倒数\(3\)天。序幕\(\text{6:40}\):到校,整理博客。\(\text{7:30}\):模拟赛发题。题意都很简单,感觉都是很怪异的配置,T1性质是显著的,一会就切了。T3感觉不知道想考啥,反手扔个乱搞。T2T4是一点思路没有,T4连暴力都不会,应该涉及到切比雪夫距离性质啥的。被创死了......
  • 10.17 小记录
    linktoproblem记录原因:自己做法代码长度太长。自己的做法:linktosubmission离线下来,离散化。题目是要求连续段的个数。Subtask$2$的做法考虑从大到小一个一个加入数。加入一个数的时候如果两边没有,答案加一;有一个,不变;都有,减一。预处理完\(O(1)\)一个询问。考虑先......
  • 10.16 模拟赛小记
    比赛链接A.link徐爷爷很强的用线段树切了,orz。正解大概是树形dp但是有O(1)的解法没想到吧...?咕咕了,还不会。B.link赛时只会写30pts的暴力,感觉成飞舞了。C.link先写了一个二维\(n^2\)的暴力dp。根据式子就可以优化掉一层循环,然后\(O(n*a[i])\)就有60pts的好......
  • Perceptual Losses 风格迁移论文复现小记
    看了一篇李飞飞组的论文PerceptualLossesforReal-TimeStyleTransferandSuper-Resolution。论文地址为:https://arxiv.org/pdf/1603.08155.pdf))想去找找代码复现一下。原文没有提供代码,就只有找找别人按照论文细节实现的代码。不过但是论文是2016年的,距离现在2023年已经......
  • 10.14 模拟赛小记
    传送门感觉我已经是半个废人了。A.P1118[USACO06FEB]BackwardDigitSumsG想到的是预处理杨辉三角,然后dfs找。我的预处理写的三维。原因是听大家打键盘的声音太吵了(指机械键盘),然后就不会写二维的了。然后只会写三维的。然后就被同学嘲讽为什么不写二维的。据说next_pe......
  • 数论筛法小记
    BaseSievebaseDirichletConvolutionSqrtDecomposition会挖坑,好让复习的时候长脑子。以下所有\(p\)都是质数,即\(p\in\mathbb{P}\),同时默认均为正整数。Base唯一分解定理(算术基本定理):\[\begin{align} \foralln>1,n=\prod\limits_{i=1}^kp_i^{t_i}\end{align}\]......
  • 我的国庆假期小记-先完成,再完美
    假期第一天玩游戏,刷视频,安逸之中似乎好像又有点无聊~假期第二天去朋友那玩了一天,逛书店的时候无意中看到一本书,买了下来以书为契机,准备找点事情来做,于是把之前一直拖延着的想法提上日程:总结下平时用过的一些技术。刚好在一个社群有大佬分享了一个放在飞书上的架构图,于是我打......