对mysql的联合索引的深刻理解

背景

对mysql的联合索引的考察是Java程序员面试高频考点!必须深刻理解掌握否则容易丢分非常可惜。

技术难点

考察对最左侧匹配原理理解。

原理

暂且不表。网上讲这非常多。我理解就是,B+树每个非叶子节点的值都是有序存放索引的值。

比如对A、B、C 三个字段做联合索引。B+输每个节点都存储A、B、C的值。首先保证A有序其次保证B有序。

重点看实战。

实战

我们做一次实战记录,避免下次面试再次犯错。

环境

mysql版本 5.7.38-log

建表语句

CREATE TABLE `user_cart_item` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
  `goods_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
  `goods_sku_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品id 有skuid的话为什么要存商品id',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '物品篮项目创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '物品篮项目更新时间',
  `sku_price` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '价格',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_user_cart_item` (`user_id`,`goods_id`,`goods_sku_id`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='物品篮项';

视代码可见我们创建一个联合索引 idx_user_cart_item

查询

 查询条件是user_id、goods_id、goods_sku_id,一定能匹配上索引没问题

EXPLAIN SELECT
	user_id,goods_id, goods_sku_id,sku_price
FROM
	user_cart_item 
WHERE
	user_id=248 and goods_id = 1 and goods_sku_id = 1

结果如下: 

 查询条件是user_id、goods_id,一定能匹配上索引没问题

EXPLAIN SELECT
	user_id,goods_id, goods_sku_id,sku_price
FROM
	user_cart_item 
WHERE
	user_id=248 and goods_id = 1 

结果如下:

 查询条件是user_id,一定能匹配上索引没问题

EXPLAIN SELECT
	user_id,goods_id, goods_sku_id,sku_price
FROM
	user_cart_item 
WHERE
	user_id=248 

结果如下:

查询条件是user_id,goods_sku_id ,按最左侧匹配原则也是能使用索引

EXPLAIN SELECT
	user_id,goods_id, goods_sku_id,sku_price
FROM
	user_cart_item 
WHERE
	user_id=248 and goods_sku_id = 1 

 结果如下:

查询条件是goods_sku_id 看能否使用索引

EXPLAIN SELECT
	user_id,goods_id, goods_sku_id,sku_price
FROM
	user_cart_item 
WHERE
  goods_sku_id = 1 

结果如下:

重点

不满足最左侧匹配是不能使用联合索引的。

特殊情况不满足最左侧匹配也能使用联合索引

EXPLAIN SELECT
	user_id,goods_id, goods_sku_id
FROM
	user_cart_item 
WHERE
  goods_sku_id = 1 

结果如下:

索引类型不是ref,而是index。是在索引范围内查找。甚过All 全表扫描

重点

当联合索引能覆盖查询字段(覆盖索引)。但查询条件并不满足最左侧匹配原则。mysql查询优化器也推荐我们使用联合索引。但索引是index。 也就是索引内查找。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity中国、Cocos为OpenHarmony游戏生态插上腾飞的翅膀

2023年是OpenHarmony游戏生态百花齐放的一年!为了扩展OpenHarmony游戏生态,OpenHarmony在基金会成立了游戏SIG小组,游戏SIG小组联合cocos,从cocos2dx入手一周内快速适配了cocos2.2.6的MVP版本,随后又分别适配了cocos2d…

【Leetcode】200. 岛屿数量

给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边…

体外循环手术中循环管路灌注流量精密自动控制解决方案

摘要:在目前的体外循环手术过程中,需要灌注师快速而精确地操作使得血液流速调节到期望的目标值。基于国外文献报道的血流量自动控制方法和装置,本文提出了技术改进且国产化解决方案。通过本解决方案中增加的国产系列电控夹管阀、电控针阀和具…

css属性clip-path的使用说明

前言 当ui设计上的图片、div等的形状不是长方形,而是多边形的时候,就可以借助clip-path这个css属性来实现。 clip-path CSS 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏。【from: MDN】 clip-path可以理解为一把剪…

一种基于Redis时间和权重关联的分布式优先级队列方法

技术背景: 深度学习平台(或存在异步任务调度的平台),存在不同的操作用户,用户存在不同的部门,调度的硬件服务器资源,按照不同的资源类型,操作系统,GPU卡的型号区分成不同…

Jenkins入门级安装部署

前言 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。通常,项目中常用Jenkins作为编译打包项目的工具&#xff0…

Maven项目转为SpringBoot项目

Maven项目转为SpringBoot项目 前言创建一个maven项目前的软件的一些通用设置Maven仓库的设置其他的设置字符编码编译器注解支持 创建的Maven项目修改为Spring Boot项目修改pom.xml文件修改启动类-Main新建WAR包所需的类 添加核心配置文件 测试的控制器最后整个项目的目录结构![…

Ragnar-lothbrok 靶机

Ragnar-lothbrok 信息搜集 存活检测 详细扫描 后台网页扫描 网站信息搜集 secret “秘密”网页 将密文保存到 password.txt 此页面使用了 wordpress CMS 疑似用户 ragnar wpscan 也爆破出了用户 ragnar wpscan --url http://10.4.7.155/wordpress/ --enumerate u 密码获…

Linux 开机启动一条PHP命令

当你开机的时候要自动的启动一条PHP命令场景:比如webman 你需要手动启动项目进程 你可以这样操作 流程: 1、准备好你要执行的命令 2、将命令写入一个服务文件 3、开机自启这个服务 实例: 1、比如这个命令 /usr/local/php/bin/php /ho…

Angular-04:指令

① 内置指令1.1 *ngIf 结构指令1.2 [hidden] 属性指令1.3. *ngFor 结构指令1.4 *ngSwitch 结构指令 ② 自定义指令用法 指令是angular操作dom的途径,分为属性指令和结构指令。属性指令:修改元素的外观或行为。使用 [ ] 包裹。结构指令:增加、…

【路径规划】A*算法 Java实现

A*(A-Star)算法是一种广泛使用的寻路算法,尤其在计算机科学和人工智能领域。 算法思想 通过评估函数来引导搜索过程,从而找到从起始点到目标点的最短路径。评估函数通常包括两部分:一部分是已经走过的实际距离&#x…

漏洞复现-Apache Druid 任意文件读取 _(CVE-2021-36749)

Apache Druid 任意文件读取 _(CVE-2021-36749) 漏洞信息 Apache Druid Version 0.22以下版本中存在安全漏洞CVE-2021-36749文件读取漏洞 描述 ​ 由于用户指定 HTTP InputSource 没有做出限制,可以通过将文件 URL 传递给 HTTP InputSourc…

网络扫描与网络监听

前言:前文给大家介绍了网络安全相关方面的基础知识体系,以及什么是黑客,本篇文章笔者就给大家带来“黑客攻击五部曲”中的网络扫描和网络监听 目录 黑客攻击五部曲 网络扫描 按扫描策略分类 按照扫描方式分类 被动式策略 系统用户扫描 …

16 用于NOMA IoT网络上行链路安全速率最大化的HAP和UAV协作框架

文章目录 摘要相关模型仿真实验仿真结果 摘要 优化无人机到HAP的信道分配、用户功率和无人机三维位置来研究上行安全传输解决非凸问题,采用K-means聚类算法,将成对的用户划分成不同的组,每个簇可以有相应的无人机服务,然后将构造…

RocksDB基本架构与原理详解

Rocksdb Flink提供基于流的有状态计算,除了提供实时数据流的处理能力,还需要将计算产生的状态存储起来。 为了满足状态存取需求,提供了memory、flie system、rocksdb三种类型的状态存储机制。 memory存取高效单空间有限,且可用…

前端JS for循环内异步接口变成同步提交(JavaScript for循环异步变同步)

遇见的问题: 导入Excel文件的时候,将每行数据整合成一个数组,循环数组插入每一条数据,插入数据后要判断是否插入成功,如果没插入成功的话,停止循环,不再插入后面的数据。甚至插入数据后&#xf…

elementui时间日期组件右边自定义图标

效果 改为 首先是将左边的清除图标关闭 然后是将右边的图标设置为display:none,设置宽度,左右内边距 最后是 mounted() {/*思路:通过document文档,选中日期时间选择器元素,然后创建一个i标签,并指定其类…

SOLIDWORKS® 2024 新功能 - SIMULATION

1、增强型轴承接头 • 通过指定压缩、拉伸和弯曲的刚度,轻松创建自定义轴承接头。 • 通过向非线性和大型位移算例添加自定义条件,提高模拟精度。 优点 使用功能强大的接口,更轻松、更准确地设置模拟过程,并加快模拟速度。 2、…

【计数DP】CF1794D

Problem - D - Codeforces 题意 思路 解法大方向对了&#xff0c;但是还是不会做&#xff0c;原因是组合数不知道怎么求 首先需要注意到一些东西&#xff1a; 1.底数一定是质数 2.质数个数 < n 一定无解 3.哪些质数作为底数是不确定的 4.n < 2022 那么我们其实可…

CentOS 7设置固定IP地址

当我们安装了一个虚拟机或者装了一个系统的时候&#xff0c;经常会遇到需要设置固定ip的情况&#xff0c;本文就以Centos 7为例&#xff0c;讲述如何修改固定IP地址。 1、用ifconfig命令查看使用的网卡 如上图所示&#xff0c;我们就会看到我们目前使用的网卡名称 2、编辑网卡…