MySQL 有多个普通索引时会取哪一个索引?

news2024/9/22 9:32:02

我们都知道MySQL在查询时底层会进行索引的优化,假设有两个普通索引,且where 后面也根据这两个普通索引查询数据,那么执行查询语句时会使用到那个索引?

为了方便演示,新建users表,新建idx_name、idx_city这两个普通索引如下:

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50) ,
  age INT,
  city VARCHAR(50) ,
  INDEX idx_name (name),
  INDEX idx_city (city)
) DEFAULT CHARSET=utf8mb4i;
INSERT INTO users (id, name, age, city)
VALUES
  (1, '张三', 25, '北京'),
  (2, '李四', 30, '上海'),
  (3, '王五', 40, '广州'),
  (4, '赵六', 35, '深圳'),
  (5, '张三', 28, '上海');

1)根据单个索引查询

根据name 查询数据时,如下图key = idx_name ,即走了idx_name的索引

explain select * from users where name = '张三';

image-20231124223736971

根据city查询数据时,如下图key = idx_city ,即走了idx_city的索引

image-20231124223934641

2)根据多个普通索引查询

示例1:

根据name和city查询,并且name和city能够定位到一条数据

explain select * from users where name = '张三' and city = '上海';

image-20231124224604957

即使没有复合索引,优化器也可以选择使用索引合并策略。它可以使用 idx_name 索引定位满足 name = '张三' 的行,然后使用 idx_city 索引在之前的结果集上进行进一步筛选,以满足 city = '上海' 的条件。

示例2:

根据name和city查询,并且单独查询name时,name = ‘张三’ 有两条记录,单独查询city时,city=‘广州’ 有一条记录

explain select * from users where name = '张三' and city = '广州';

image-20231124225014062

此时优化器会走idx_city索引,这是因为如果走idx_name索引要查询两次,根据idx_city一次查询就能定位到具体的数据,因此此处优化器采用idx_city作为索引。

同样执行如下SQL也是走的idx_city的索引,因为city='北京’的记录只有一条

explain select * from users where name = '张三' and city = '北京';

再来看看下面的这个SQL语句,会走那个索引呢?

explain select * from users where name = '李四' and city = '上海';

image-20231124225751394

如上图,当根据name = '李四’查询出来数据只有一条、city='上海’有两条数据,最终结果走的是idx_name索引

示例3:

explain select * from users where   city = '广州' and name = '赵六';

explain select * from users where name = '赵六' and city = '广州';

上面两个SQL语句查询执行计划时发现,两条语句的查询计划是一致的,都是直接走idx_name索引,不管where条件后面name和city的先后顺序

image-20231124231026353

原因是,如上图执行计划中possiblie_keys = idx_name,idx_city。因为idx_name 先创建,所以优化器会先判断是否走了idx_name索引,name=‘赵六’ 刚好检索出一条记录

实例4

explain select * from users where   city = '广州' and name = '张三';

image-20231124232144601

这个时候走的是idx_city的索引,不管where条件后面name和city的顺序。

案例5

explain select * from users where   city = '广州' and name = '王五';
explain select * from users where   name = '王五' and city = '广州' ;

image-20231124232553815

以上两个SQL都走了idx_name的索引,和案例1有一些区别,案例1中,name = ‘张三’ 或者 city = '上海’都能查询多多行数据,如果使用联合索引的话效率更高。案例5中,由于根据idx_name就能把这一行的数据给定位到了,因此采用idx_name索引就能满足。

以上都是MySQL优化器自动选择索引,那如果我们想强制使用自己的索引可以使用 force index,具体如下

查询name = ‘张三’ 、city = '广州’的数据,我们通过查询计划得知走的是idx_city索引。

explain select * from users where name = '张三' and city = '广州';

在这里插入图片描述
如果我们强制使用idx_name索引,看看效果,发现已经强制使用idx_name索引
在这里插入图片描述

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

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

相关文章

基于Eclipse+Tomcat+Mysql开发的研究生信息教务系统

基于Eclipse的研究生教务系统 项目介绍💁🏻 该研究生教务系统是一款集学生信息管理、学院信息维护、学生类别信息维护、专业信息维护、教师信息导入、课程信息导入及老师信息导入等功能于一体的教育管理软件。它以高效、便捷、准确的方式处理教务管理工作…

系列七、事务

一、事务 1.1、概述 事务是数据库操作的基本单元,它是指逻辑上的一组操作,要么都成功,要么都失败。典型场景:转账,例如Jack给Rose转账1000元,转账成功:Jack账户的余额少1000元,Rose…

深度学习+不良身体姿势检测+警报系统+代码+部署(姿态识别矫正系统)

正确的身体姿势是一个人整体健康的关键。然而,保持正确的身体姿势可能很困难,因为我们经常忘记这一点。这篇博文将引导您完成为此构建解决方案所需的步骤。最近,我们在使用 POSE 进行身体姿势检测方面玩得很开心。它就像一个魅力!…

关于vs code Debug调试时候出现“找不到任务C/C++: g++.exe build active file” 解决方法

vs code Debug调试时候出现“找不到任务C/C: g.exe build active file” ,出现报错,Debug失败 后来经过摸索和上网查找资料解决问题 方法如下 在Vs code的操作页面左侧有几个配置文件 红框里的是需要将要修改的文件 查看tasks.json和launch.json框选&…

四、防火墙-NAT Server

学习防火墙之前,对路由交换应要有一定的认识 NAT Server1.1.基本原理1.2.多出口场景下的NAT Server1.3.源进源出 —————————————————————————————————————————————————— NAT Server 一般对用户提供一些可访问的…

前端学习网站推荐

1.菜鸟教程(程序员必备)菜鸟教程 - 学的不仅是技术,更是梦想! 2.npm库 npm | Home 3.uniapp学习官网 uni-app官网 4.vue官网 快速上手 | Vue.js 5.ECharts图表 Apache ECharts 6.ES6学习 ES6 入门教程 7.Three.js学习 Three.js…

数据结构——单链表(Singly Linked List)

1.链表介绍 链表是一种物理储存上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。 对于上图,每一个结点都是一个结…

概率论与数理统计中常见的随机变量分布律、数学期望、方差及其介绍

1 离散型随机变量 1.1 0-1分布 设随机变量X的所有可能取值为0与1两个值,其分布律为 若分布律如上所示,则称X服从以P为参数的(0-1)分布或两点分布。记作X~ B(1,p) 0-1分布的分布律利用表格法表示为: X01P1-PP 0-1分布的数学期望E(X) 0 *…

【前端】让列表像Excel单元格一样编辑

前言 领导说了一堆的话,最后总结一句就是客户很懒,客户的员工更加懒。 本着让别人节省时间的原则,提倡出了让列表和Excal的单元格一样,不仅看数据还可以随时更改数据。 查资料 根据 Jeecg-Vue3 源码介绍,从而知道是基于 Vben Admin 开源项目进行改造的。 因此在 Vben…

web前端之引入svg图片、html引入点svg文件、等比缩放、解决裁剪问题、命名空间、object标签、阿里巴巴尺量图、embed标签、iframe标签

MENU 前言直接在页面编写svg使用img标签引入通过css引入使用object标签引入其他标签参考资料 前言 web应用开发使用svg图片的方式,有如下几种方式 1、直接在页面编写svg 2、使用img标签引入 3、通过css引入 4、使用object标签引入 直接在页面编写svg 在html页面直接…

hive 报错return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路

参考学习 https://github.com/apache/hive/blob/2b57dd27ad61e552f93817ac69313066af6562d9/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java#L47 为啥学习error code 开发过程中遇到以下错误,大家觉得应该怎么办?从哪方面入手呢? 1.百…

【CVE-2021-1675】Spoolsv打印机服务任意DLL加载漏洞分析

漏洞详情 简介 打印机服务提供了添加打印机的接口,该接口缺乏安全性校验,导致攻击者可以伪造打印机信息,在添加新的打印机时实现加载恶意DLL。这造成的后果就是以system权限执行任意代码。 影响版本 windows_10 20h2 windows_10 21h1 win…

我在electron中集成了自己的ai大模型

同学们可以私信我加入学习群! 正文开始 前言一、大模型选择二、获取key三、调用api四、调用ai模型api时,解决跨域总结 前言 最近单位把gpt、文心一言、通义千问、星火等等等等你能想到的ai大模型都给禁掉了,简直丧心病狂。 不知道有多少感同…

【多线程】-- 01 线程创建之继承Thread多线程同步下载网络图片

多线程 1 简介 1.1 多任务、多线程 普通方法调用:只有主线程一条执行路径 多线程:多条执行路径,主线程和子线程并行交替执行 如下图所示: 1.2 程序.进程.线程 一个进程可以有多个线程,例如视频中同时听声音、看图…

unordered_map 与 unordered_set 的模拟实现

unordered_map 与 unordred_set 的模拟实现与 map 与 set 的模拟实现差不多。map 与 set 的模拟实现中,底层的数据结构是红黑树。unordered_map 与 unordered_set 的底层数据结构是哈希表。因此,在模拟实现 unordered_map 与 unordred_set 之前你必须确保…

Find My鼠标|苹果Find My技术与鼠标结合,智能防丢,全球定位

随着折叠屏、多屏幕、OLED 等新兴技术在个人计算机上的应用,产品更新换代大大加速,进一步推动了个人计算机需求的增长。根据 IDC 统计,2021 年全球 PC 市场出货量达到 3.49 亿台,同比增长 14.80%,随着个人计算机市场发…

【从浅识到熟知Linux】基本指定之zip、unzip和tar

🎈归属专栏:从浅学到熟知Linux 🚗个人主页:Jammingpro 🐟每日一句:周五写博客更刺激了,想到明天可以晚起床半小时,瞬间精神抖擞。再写它10篇博客。 文章前言:本文介绍zip…

Tars-GO 开发

默认环境是安装好的 创建服务: tarsgo make App Server Servant GoModuleName Tars 实例的名称,有三个层级,分别是 App(应用)、Server(服务)、Servant(服务者,有时也称 Object&am…

什么是AWS CodeWhisperer?

AWS CodeWhisperer https://aws.amazon.com/cn/codewhisperer/ CodeWhisperer 经过数十亿行代码的训练,可以根据您的评论和现有代码实时生成从代码片段到全函数的代码建议。 ✔ 为您量身定制的实时 AI 代码生成器 ✔ 支持热门编程语言和 IDE ✔ 针对 AWS 服务的优…

前端大厂(腾讯、字节跳动、阿里......)校招面试真题解析,让你面试轻松无压力!

前言 校招很重要,应届生的身份很珍贵!在校招的时候与我们竞争的大部分都是没有工作经验的学生,而且校招企业对学生的包容度高,一般对企业来说,社招更看重实际工作经验,而校招更愿意“培养人”,校…