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

我们都知道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.hqwc.cn/news/215807.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch集群部署

组件介绍 1、Elasticsearch: 是基于一个Lucene的搜索引擎,提供搜索,分析。存储数据三大功能,他提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,Elasticsearch是用Java开发的,…

Ps:画笔工具的基本操作

画笔工具 Brush Tool是 Ps 中最常用的工具,广泛地用于绘画与修饰工作。 虽然多数操作可在画笔工具的工具选项栏中选择执行,但是如果能记住相应的快捷键可大大提高工作效率。 熟练掌握画笔工具的操作对于使用其他工具也非常有益,因为 Ps 中许多…

Oracle研学-介绍及安装

一 ORACLE数据库特点: 支持多用户,大事务量的事务处理数据安全性和完整性控制支持分布式数据处理可移植性(跨平台,linux转Windows) 二 ORACLE体系结构 数据库:oracle是一个全局数据库,一个数据库可以有多个实例,每个…

vs2015如何远程启动程序来进行调试

vs远程调试的方式有两种,远程启动方式和附加进程方式。   一般来说,咱们使用vs调试代码时,直接附加进程即可,但某些时候附加进程方式无法命中断点。比如我们想调试的C代码,但是调试的入口程序是C#程序,如…

2023亚太杯数学建模B题完整原创论文讲解

大家好呀,从发布赛题一直到现在,总算完成了2023亚太地区数学建模竞赛B题玻璃温室的微气候调控完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 论文共6…

数字图像处理基础-用通俗语言进行超详细的总结

目录 图像感知与获取 韦伯定理 马赫带效应 图像获取 图像的采样和量化 图像内插(重采样) 图像的表示与描述 像素间的关系 exercise:4-邻域连通区域标记 本文章讲解数字图像处理的基础,大部分内容来源于课堂笔记中 图像感…

有序表的详解

目录 有序表的介绍 树的左旋和右旋操作 AVL树的详解 SB树的详解 红黑树的介绍 SkipList的详解 有序表的介绍 有序表是除具备哈希表所具备的功能外,有序表中的内容都是按照key有序排列的,并且增删改查等操作的时间复杂度都是,红黑树&…

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步?

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步? 文章目录 【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步?一、简介软件特色演示: 二、使用免费群晖虚拟机搭建群晖Synology Drive服务,实现局域网同步1 安…

postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第35讲&#…

【maven】【IDEA】idea中使用maven编译项目,报错java: 错误: 找不到符号 【2】

idea中使用maven编译项目,报错java: 错误: 找不到符号 错误状况展示: 如果报这种错,是因为项目中真的找不到报错的方法或者枚举 字段之类的,但实际是 : 点击 File Path

基于SRGAN的人脸图像超分辨率

引言 SRGAN是第一个将GAN用在图像超分辨率上的模型。在这之前,超分辨率常用的损失是L1、L2这种像素损失,这使得模型倾向于学习到平均的结果,也就是给低分辨率图像增加“模糊的细节”。SRGAN引入GAN来解决这个问题。GAN可以生成“真实”的图像…

Vue 2.0源码分析-Virtual DOM

Virtual DOM 这个概念相信大部分人都不会陌生,它产生的前提是浏览器中的 DOM 是很“昂贵"的,为了更直观的感受,我们可以简单的把一个简单的 div 元素的属性都打印出来,如图所示: 可以看到,真正的 DOM …