面试官三连问:给我讲讲什么是索引覆盖?什么是索引下推 ? 什么是最左匹配原则 ?

news2024/9/25 19:18:33

1.什么是索引覆盖

        索引覆盖是指在一个查询语句中,某个索引已经 "覆盖了" 需要被查询出来的列,此时就不需要进行回表查询了,这就叫做索引覆盖!!(索引覆盖它是非聚簇索引中的一个特殊情况)

【案例】当我们写了这样一个 SQL,实际上它走的是辅助索引,结构如下图:

select id from student where name = 'Bob';

  1. 辅助索引(非聚簇索引)中的查询,一般是需要查询两次,第一次查询出聚簇索引,然后根据聚簇索引回表查询,最终拿到行数据。
  2. 但是此处我的查询需求刚好就是聚簇索引,因此一次查询就可以拿到需要的列,不需要进行回表,这就是索引覆盖~

【加强理解】以下四种情况都属于索引覆盖 >>

// 联合索引 (name,age)
select name from student where.....

select age from student where.....

select name,age from student where.....

select address,name,age from student where address = '深圳';

最后一个 SQL 因为 where 条件后面可以知道 address,所以也不需要回表查询!!

2.什么是索引下推

        索引下推是指在查询非聚簇索时,拿到了叶子结点的聚簇索引,然后对聚簇索引中包含的字段先做判断,直接过滤吊不满足条件的记录,从而减少回表次数,这就是索引下推!!(索引下推是在 MySQL 5.6 之后才引入的,它属于非聚簇索引中功能

以 user 表中的联合索引(name,age)为例:

select * from user where name='张%' and age='10';

// 表中有四条数据
// 1  张三  10
// 2  张四  11
// 3  张五  12
// 4  老六  13

🍁MySQL 5.6 之前没有索引下推,它的执行流程如下:

① 在非聚簇索引中根据 name='张%' 查到聚簇索引中匹配的 id

② 使用匹配的 id 进行回表查询

此时会进行三次回表操作,而联合索引中的 age 字段就没用上。

🍁MySQl 5.6 之后引入索引下推,它会根据 name='张%' 和 age 一起过滤数据:

【好处】:它的第二步操作就可以节省回表的次数

② 使用匹配的 id 进行回表查询

 引入索引下推后,只执行了一次回表查询,这就是索引下推的好处。

3.什么是最左匹配原则

【定义和规则】

  • 最左匹配原则是指索引以最左边的为起点,任何连续的索引都能匹配上,
  • 当遇到范围查询 (>、<、between、like) 就会停止匹配。

什么意思呢 ??

比如联合索引 index(a,b,c),以下 SQL 来理解什么是最左匹配原则:

select * from user where a=1; // 只使用索引 a

select * from user where b=2; // 不使用索引

select * from user where c=3; // 不使用索引

select * from user where a=1 and b=2; // 只使用索引 a,b

select * from user where a=1 and c=3; // 只是用索引 a

select * from user where b=2 and c=3; // 不使用索引

select * from user where a=1 and b=2 and c=3; // 使用索引 a,b,c

select * from user where a=1 and b like '%xxx' and c=3; // 只使用索引 a,b

通过上面的例子,我相信大家已经大概理解了什么是最左匹配原则~

【疑惑一】

        不是说使用了 like,就停止匹配了吗,为什么前面的索引下推使用了 name='张%' 还能再拿 age 进行过滤呢 ?

对于 like 查询,它的常见写法有三种:

  • 模糊匹配后面任意字符:like '张%'
  • 模糊匹配前面任意字符:like '%张'
  • 模糊匹配前后任意字符:like '%张%'

        这三种情况,只有第一种情况是会走索引的,其他的都会导致索引失效,所以前面索引下推例子中的 name='张%' 是不会停止匹配的~

【疑惑二】

        当我们写出这样的条件语句 where a=1 and c=3 and b=2 时,引擎为什么不把它调整为 a,b,c 的顺序呢?

        MySQL 8.0 之后才涉及到这样的调优,但是具体会不会调优,是不一定的,因为索引调优的主动权在索引的优化器里面的,而优化器这个东西,它很玄学,所以不知道它会不会进行调优。

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

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

相关文章

3.2.0 版本预告!远程日志解决 Worker 故障获取不到日志的问题

Apache DolphinScheduler 3.2.0 版本已经呼之欲出&#xff0c;8 月 中下旬&#xff0c;这个大版本就要和用户见面了。为了让大家提前了解到此版本更新的主要内容&#xff0c;我们已经制作了几期视频和内容做了大致介绍&#xff0c;包括《重磅预告&#xff01;Apache DolphinSch…

快递再多也不怕!你的顺丰快递用上5G“神器”

互联网时代&#xff0c;剁手党疯狂“买买买”之后&#xff0c;快递件量再创新高。《2023年6月中国快递发展指数报告》显示&#xff0c;2023二季度单月快递业务量稳定在百亿件以上。其中&#xff0c;由于“618”电商促销活动与父亲节叠加&#xff0c;6月16日至20日单日揽收量均超…

js ajax 国内快速 映像

ajax 快速 映像 https://www.bootcdn.cn/ axios入门和axios基本请求方式 https://blog.csdn.net/m0_68997646/article/details/127438174 使用 jsDelivr CDN: <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>因为我们国…

ThinkPHP6.0+ 使用Redis 原始用法

composer 安装 predis/predis 依赖&#xff0c;或者安装php_redis.dll的扩展。 我这里选择的是predis/predis 依赖。 composer require predis/predis 进入config/cache.php 配置添加redis缓存支持 示例&#xff1a; <?php// -----------------------------------------…

【文件上传】大文件分片上传、断点续传、秒传前后端实现

1、大文件上传面临的问题&#xff1a; 在传统的文件上传中&#xff0c;由于文件过大&#xff0c;导致网络传输时间长&#xff0c;这过程中会遇到网络不稳定或者不小心关闭的浏览器&#xff08;电脑&#xff09;的情况&#xff0c;从而导致文件上传中断。中断之后&#xff0c;又…

第三届OceanBase数据库大赛启动,升级为国家级竞赛

近日&#xff0c;第三届OceanBase数据库大赛启动报名。本届大赛进一步升级为全国大学生计算机系统能力大赛&#xff0c;由系统能力培养研究专家组发起&#xff0c;全国高等学校计算机教育研究会、系统能力培养研究项目发起高校主办&#xff0c;OceanBase承办&#xff0c;旨在培…

API接口开发系列,各电商(商品详情数据,商品sku数据,商品属性数据,商品优惠券数据)

API接口开发是指开发和构建应用程序之间交流的接口。主要包括设计、实现和维护接口&#xff0c;以便不同应用程序之间可以进行数据交换和相互调用功能。通过API接口开发&#xff0c;可以实现不同系统、平台或服务之间的数据交互和功能集成。 API接口开发的步骤一般包括以下几个…

程序员当累了,带爱人出去广西北海旅游下吧

先说说消费吧&#xff0c;我们一共花了8000多块钱。 两个人坐的往返机票&#xff0c;3600块钱。 上涠洲岛的船票加门票890块钱 住宿费一共4天850&#xff0c; 北海 两天350&#xff0c;涠洲岛住两天400。 路费住宿5500(200滴滴打车费) 其他消费2500 好吧&#xff0c;现在开始我…

【Apollo】Apollo 8.0系统下载指南

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

二叉树题目:二叉树的坡度

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的坡度 出处&#xff1a;563. 二叉树的坡度 难度 3 级 题目描述 要求 给你一个二叉树的根结点 root \texttt{root} root&#xff0c;返回树…

新能源电动车交流充电桩主板技术参数

你是否知道交流充电桩主板的技术参数呢?今天我们就来了解一下。 首先&#xff0c;交流充电桩主板一般采用10V-60V电压&#xff0c;支持多种电压输入&#xff0c;比如220V、380V、400V等&#xff0c;可以满足不同用户的需求。其次&#xff0c;频率一般为50/60Hz&#xff0c;但也…

uniapp编写微信小程序遇到的坑总结

1、阻止事件冒泡 使用uniapp开发微信小程序的时候&#xff0c;发现使用click.stop来阻止事件冒泡没有作用&#xff0c;点击了之后发现仍然会触发父组件或者祖先组件的事件。 在网上查阅&#xff0c;发现使用tap.stop才能阻止事件冒泡。 2、二维码生成 在网上找了很多&…

【进程与线程】最好懂的讲解

目录 1.CPU的管理 2.进程 2.1.概述 2.2.数据结构 2.3.进程状态 2.4.进程与内存 2.5.PCB队列 3.线程 3.1.概述 3.2.实现 1.CPU的管理 进程和线程是操作系统里面的概念&#xff0c;这个概念其实是对CPU的管理策略。整个操作系统都可以看作计算机硬件的管理软件&#x…

git本地选项配置

一&#xff0c;简介 在git工具安装完成之后&#xff0c;需要设置一下常用的配置&#xff0c;如邮箱&#xff0c;缩写&#xff0c;以及git commit模板等等。本文就来详细介绍些各个配置如何操作&#xff0c;供参考。 二&#xff0c;配置步骤 2.1 查看当前git的配置 git conf…

JVM性能分析-jstat工具观察gc频率

jstat jstat是java自带的工具&#xff0c;在bin目录下 用法 语法&#xff1a;jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] [kqkyyj-2 bin]$ jstat -help Usage: jstat -help|-optionsjstat -<option> [-t] [-h&l…

C++ 面向对象三大特性——继承

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C 继承 ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向对象三大特性的&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff…

官网下载安装达芬奇18.5详细步骤

目录 一、介绍 &#xff08;一&#xff09;特色功能介绍 &#xff08;二&#xff09;版本介绍 二、下载安装教程 &#xff08;一&#xff09;达芬奇官网下载 &#xff08;二&#xff09;安装 一、介绍 &#xff08;一&#xff09;特色功能介绍 以下是达芬奇视频剪辑软件…

【UE4 RTS】11-HUD functionality Part1

前言 本篇实现了将游戏状态中的游戏时间和游戏日期通过蓝图接口的方式传递给控件蓝图&#xff0c;并且正确显示&#xff0c;另外还实现了控件蓝图界面上切换12小时和24小时制的游戏时间显示方式。 效果 步骤 一、显示游戏日期 1. 打开蓝图接口“RTS_GameTime_IF” 添加一个…

回声消除-卡尔曼滤波

卡尔曼滤波 卡尔曼滤波的设计过程中需要定义两个变量&#xff0c;一个是状态量&#xff0c;另一个是观测量 状态量 状态量是跟踪目标。将状态量记作 x n \mathbf{x}_n xn​&#xff0c;状态量的协方差矩阵记作 P n \mathbf{P}_n Pn​&#xff0c;可以由前一个时刻的状态&…

视频集中存储/云存储/磁盘阵列EasyCVR平台接入RTSP设备出现离线情况的排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…