找到某个技术点答案的正确姿势以const和ref_eq区别为例

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 找到某个技术点答案的正确姿势以const和ref_eq区别为例

一、背景

有个朋友问一个问题“能不能帮忙看下const和ref_eq有啥区别,mysql高性能书籍里面的讲得不太明白”。


结合这个具体问题,讲解一下这类问题我们该如何解决。


二、过程

2.1 源码大法

由于mysql源码貌似不是java写的,找起来也费劲,源码大法貌似先不能用,我们先放弃。


2.2 搜索引擎大法

搜到了一篇类似的博客


http://www.bubuko.com/infodetail-3091337.html


eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见主键或者唯一索引扫描


 const: 表示通过索引一次就找到了,const用于比较primary_key和union,由于只匹配一条数据,所以很快,


找了很多这类博客,貌似讲得也不太清楚


或者StackOverFlow上查询,不过没发现好的解释。


2.3 翻书大法

找相关的比较经典的权威的图书。


比如我们找《MySQL深度剖析》,没有找到特别通俗的解释,放弃。


2.4 命令help大法

找了半天没找到类似 mysql explain --help这种命令,放弃。


如果有帮助命令,一般解释非常权威和详细。


2.5 官方文档大法

其实很多文章都是根据官方的文档自己翻译过来的,或者根据官方文档写的书,或者根据别人的理解写的文章。


因此看源码和看官方文档更权威。


我们找到了对应的文档:


https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#jointype_const




const

该表最多有一个匹配行, 在查询开始时读取。由于只有一行, 因此该行中列的值可以被优化器的其余部分视为常量。const 表非常快, 因为它们只读一次。


const用于将 "主键" 或 "唯一" 索引的所有部分与常量值进行比较。


这里的表述都是“an table”,而且示例也是单表,因此应该只在单表查询时。


https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#jointype_eq_ref




读取本表中和关联表表中的每行组合成的一行。除 了 system 和 const 类型之外, 这是最好的联接类型。当连接使用索引的所有部分时, 索引是主键或唯一非 NULL 索引时, 将使用该值。

eq_ref 可用于使用 = 运算符比较的索引列。比较值可以是常量或使用此表之前读取的表中的列的表达式。通常用在多表查询中。


这里总是提到"tables",且示例都是多个表,用在多表查询时。


三、learn more

另外跟据我们的learn more的习惯,我们可以去mysql官方文档中找到其他类型的详细说明和示例,系统掌握相关知识点。


这样我们遇到一个点不会的,我们就把整条线都掌握了。


我们还可以了解他们之间的好坏排序


type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref> ref> fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index>all,一般来说,得保证查询至少达到range级别,最好能达到ref。


甚至可以看官方文档的其他章节内容。


四、demo大法

根据官方文档的解释,创建一个表去验证。动动手,印象更深刻。


此处略掉。


五、通法

这类问题,可以参考第二部分的几个步骤来解决。


源码,搜索引擎,翻书,命令帮助,官方文档,写demo验证等几个角度去找到想要的答案。


创作不易,如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/92254309

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
JavaScript Dubbo Java
还用 if(obj!=null) 做非空判断?带你快速上手 Optional 实战性理解
1.前言 2.认识Optional并使用 3.实战场景再现 4.Optional使用注意事项 5.jdk1.9对Optional优化
|
4月前
|
语音技术 Python
语音识别,continue和break的使用,循环综合案例,完成发工资案例,函数的初体验,len()是内置好的函数,def 函数名 def xxx(),函数的定义 def xxx() ,调用函数
语音识别,continue和break的使用,循环综合案例,完成发工资案例,函数的初体验,len()是内置好的函数,def 函数名 def xxx(),函数的定义 def xxx() ,调用函数
|
6月前
|
SQL JavaScript
js开发:请解释什么是ES6的模板字符串(template string),并给出一个示例。
ES6的模板字符串以反引号包围,支持变量和表达式插入以及多行书写。例如,插入变量值`Hello, ${name}!`,计算表达式`${num1 + num2}`,以及创建多行字符串。模板字符串保留原始空格和缩进,简化了字符串拼接,提高了代码可读性。
54 6
|
6月前
|
前端开发
【前端学习】—let const var之间的区别(十三)
【前端学习】—let const var之间的区别(十三)
|
JavaScript 数据安全/隐私保护 开发者
JS逆向 -- 某视频val值和pid值的加密分析
JS逆向 -- 某视频val值和pid值的加密分析
79 0
|
前端开发
前端学习案例1-empty和undefined区别
前端学习案例1-empty和undefined区别
84 0
前端学习案例1-empty和undefined区别
|
前端开发
#yyds干货盘点 【React工作记录十七】根据数组code值返回value值
#yyds干货盘点 【React工作记录十七】根据数组code值返回value值
78 0
|
编译器 Linux C语言
C++__return 0是什么意思?
C++__return 0是什么意思?
341 0
|
编译器
每日一题:var、let、const之间的区别你真的理解了吗?
每日一题:var、let、const之间的区别你真的理解了吗?
98 0
|
前端开发
前端经典面试题解密-add(1)(2)(3)(4) == 10到底是个啥?
前端的小伙伴在面试的时候,几乎都会遇到一道这样的面试题: add(1)(2)(3)(4)输出结果为10。在第一次看到这道面试题的时候,很多小伙伴感到了迷茫!借用王宝强在《人在囧途》中的表演:啥啥啥,这写的都是啥?下面胡哥为各位小伙伴带来这道题的揭秘。
196 0