MySQL 索引的使用

news2024/11/17 3:37:10

本篇主要介绍MySQL中索引使用的相关内容。

目录

一、最左前缀法则

二、索引失效的场景

索引列运算

字符串无引号

模糊查询

or连接条件

数据分布


一、最左前缀法则

当我们在使用多个字段构成的索引时(联合索引),需要考虑最左前缀法则,最左前缀法则指的是,在使用联合索引来查询时,需要在查询条件里包含联合索引的所有字段,如果跳过了某个字段,那么该字段后面的其它字段(联合索引中的字段)的索引将全部失效。

例如,这里有一张表,表结构如下:

然后我们根据其中的sn,name,price三个字段建立联合索引 

此时,我们再通过explain来查看一下查询条件三个字段都包含的SQL语句的执行情况:

可以发现此时索引长度为1208.

接下来我们去掉最左边的sn字段

可以发现此时一个索引都不走了,因为最左前缀法则,使得sn以及后面的name,prcie字段的索引都失效了,从而整个联合索引都失效,致使该查询SQL不再走索引。我们再来跳过name字段看一下 可以发现索引长度只有402,那是因为跳过了name字段,使得name字段和price的索引都失效。

需要注意的是,如果我们其中一个字段,进行了范围查询,例如”<",也会导致该字段被跳过,此时我们需要使用 " <= "才不会使字段被跳过。因此,在使用联合索引时,如果要范围查询,尽量使用“<=" 或者 ">="。

综上所述,我们在使用联合索引时,应当遵从最左前缀法则,以免索引失效影响我们查询的性能。

二、索引失效的场景

在MySQL中,即使我们创建了索引,但在查询时不走索引,而是继续全表扫描,像这种情况,就称为索引失效,前面,联合索引跳过字段就是一种索引失效的场景。在MySQL中,很多场景下都有可能会出现索引失效的情况,下面我们来具体了解一下。

索引列运算

当我们在使用单列索引时(对一个字段创建的索引),如果我们对该列进行函数运,那么索引将会失效。例如,我们对weight字段创建一个单列索引:

如果我们对weight字段进行等值查询,通过explain可以发现成功走了索引 :

但如果我们在查询时使用了函数运算,通过explain可以发现并没有走索引,索引失效了。

字符串无引号

当我们在对一个字符串类型的字段通过索引进行查询时,如果字段的值未数值且没有加引号,索引将失效。

例如这里有一个字符串类型的字段name,给该字段添加索引。

 

然后我们通过索引来进行一下查询,查询时字段值加引号 可以发现此次查询走了索引。

我们再来看一下不加引号的情况(值为数值) 可以发现并未走索引,索引失效了 。

模糊查询

在对字符串类型的字段通过索引来查询时,如果使用了模糊匹配,且在模糊匹配的字符串前加了‘ % ’号则索引失效。例如我们还是使用前面的name字段,然后使用模糊匹配进行查询,分别在中间和末尾加上”%"号

可以发现这两次都走了索引。接下来我们再来看一下"%"号在前面的情况:

 结果可以发现索引失效了,但通常情况下,我们需要在最前面加"%"号,但我们又想走索引,那怎么办呢?我们可以使用覆盖索引来解决,使用覆盖索引在前面加 ” %"号索引就不会失效了。(覆盖索引在后面会详细介绍)。

or连接条件

在查询中使用了or关键字时,如果or前面的字段有索引,而or后面的字段没有使用索引,那么or前面的和or后面的字段的索引将全部失效。

例如,我们通过explain来查看一下下面这条SQL, 可以发现由于or后面的age字段没有添加索引,导致前面的name字段的索引失效了,接下来,我们给age加上索引

可以发现此时索引生效了,因此可以得出结论只有or前面的字段和后面的字段都有索引时,索引才会生效。

数据分布

在查询过程中,如果查询的结果的行数和整张表的行数接近,那么MySQL就会认为走索引不如全表扫描效率高(因为此时索引查的次数和全表查询接近了,且索引还需要进行回表等操作,因此此时索引的效率就不如全表扫描了),因此就不走索引,而是进行全部扫描,从而导致索引失效。

例如我们来用explian看一下下面这条SQL 

可以发现并没有走索引,这是因为表中大部分记录的name字段都不为空,系统认为全表扫描可能效率更高,从而使索引失效了。

然后我们再来看一下下面这条SQL:

可以发现这次走了索引,这是因为表中的记录基本都不为空,因此索引只需要查几次就能完成查询而全表扫描需要遍历整张表,因此系统选择了更快的走索引的方式。 

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

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

相关文章

基于物理的分析模型,用于具有场板结构的GaN HEMT的输入、输出及反向电容

Physics-Based Analytical Model for Input, Output, and Reverse Capacitance of a GaN HEMT With the Field-Plate Structure&#xff08;TPE 17年&#xff09; 摘要 该论文提出了一种分析模型&#xff0c;用于描述带有场板结构的常开型AlGaN/GaN高电子迁移率晶体管&#x…

多屏多机同控!天途首发瑶光智控地面站

瑶光智控地面站全新发布&#xff01;高性能处理器&#xff0c;高亮三屏显示。内置天途云控系统&#xff0c;融合图传、控制、存储和数据处理等功能与一体&#xff0c;强大算力&#xff0c;高度集成无人机、无人船、无人车和机械狗等多种无人装备进行云控云算。 内置4G公网通讯模…

RabbitMQ-发布/订阅模式

1、发布/订阅模式介绍 在普通的生产者、消费者模式&#xff0c;rabbitmq会将消息依次传递给每一个消费者&#xff0c;一个worker一个&#xff0c;平均分配&#xff0c;这就是Round-robin调度方式&#xff0c;为了实现更加复杂的调度&#xff0c;我们就需要使用发布/订阅的方式…

现货白银的交易时间有多连贯?

国际市场上的现货白银优势很多&#xff0c;它除了具备国内同类型品种所不具备的数十倍资金杠杆外&#xff0c;也基本上实现了全天24小时不间断的交易时间&#xff0c;所以投资者可以在全天候连贯的行情中&#xff0c;寻找属于自己的交易获利机会。 但对于内地的投资者来说&…

【香橙派 AIpro】新手保姆级开箱教程:Linux镜像+vscode远程连接

香橙派 AIpro 开发板 AI 应用部署测评 写在最前面一、开发板概述官方资料试用印象适用场景 二、详细开发前准备步骤1. 环境准备2. 环境搭建3. vscode安装ssh插件4. 香橙派 AIpro 添加连接配置5. 连接香橙派 AIpro6. SSH配置 二、详细开发步骤1. 登录 juypter lab2. 样例运行3. …

HQChart使用教程100-uniapp如何在vue3运行微信小程序

HQChart使用教程100-uniapp如何在vue3运行微信小程序 症状原因分析解决思路解决步骤1. 修改vender.js2. 修改HQChartControl.js 完整实例HQChart代码地址 症状 HQChart插件在uniappvue3的项目编译成小程序以后&#xff0c; 运行会报错&#xff0c;见下图。 原因分析 查了下…

从了解到掌握 Spark 计算框架(二)RDD

文章目录 RDD 概述RDD 组成RDD 的作用RDD 算子分类RDD 的创建1.从外部数据源读取2.从已有的集合或数组创建3.从已有的 RDD 进行转换 RDD 常用算子大全转换算子行动算子 RDD 算子综合练习RDD 依赖关系窄依赖宽依赖宽窄依赖算子区分 RDD 血统信息血统信息的作用血统信息的组成代码…

【C语言回顾】预处理

前言1. 简单概要2. 预处理命令讲解结语 上期回顾: 【C语言回顾】编译和链接 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【C语言学习】 前言 各位小伙伴大家好&#xff01;上期小编给大家讲解了C语言中的编译和链接&#xff0c;接下来我们讲解一下预处理&#xff01; …

k8s自定义资源你会创建吗

创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition&#xff08;CRD&#xff09;时&#xff0c;Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的&#xff0c;也可以是集群作用域的…

接口测试工具:Postman的下载安装及使用

1 Postman 介绍 1.1 Postman 是什么 Postman 是一款功能超级强大的用于发送 HTTP 请求的 测试工具 做 WEB 页面开发和测试的人员常用工具 创建和发送任何的 HTTP 请求(Get/Post/Put/Delete...) 1.2 Postman 相关资源 1.2.1 官方网站&#xff1a;https://www.postman.com/ …

算法(七)插入排序

文章目录 插入排序简介代码实现 插入排序简介 插入排序&#xff08;insertion sort)是从第一个元素开始&#xff0c;该元素就认为已经被排序过了。然后取出下一个元素&#xff0c;从该元素的前一个索引下标开始往前扫描&#xff0c;比该值大的元素往后移动。直到遇到比它小的元…

【Uniapp小程序】自定义导航栏uni-nav-bar滚动渐变色

效果图 新建activityScrollTop.js作为mixins export default {data() {return {navBgColor: "rgba(0,0,0,0)", // 初始背景颜色为完全透明navTextColor: "rgba(0,0,0,1)", // 初始文字颜色};},onPageScroll(e) {// 设置背景const newAlpha Math.min((e.s…

elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester&#xff08;补全建议&#xff09; Elasticsearch7.15安装 官方文档 补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能&#xff0c;引导用户在输入时找到相关结果&#xff0c;提高搜索精度。 理想情况下&#xff0c;自动补…

手机站怎么推广

随着手机的普及和移动互联网的快速发展&#xff0c;越来越多的人开始使用手机进行在线购物、社交娱乐、阅读资讯等&#xff0c;同时也催生了越来越多的手机站的出现。但是&#xff0c;在海量的手机站中&#xff0c;要让自己的手机站脱颖而出&#xff0c;吸引更多用户访问和使用…

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势

β-烟酰胺单核苷酸&#xff08;NMN&#xff09;功能不断得到验证 市场规模呈增长态势 β-烟酰胺单核苷酸&#xff08;β-Nicotinamide mononucleotide&#xff0c;NMN&#xff09;是一种生物活性分子&#xff0c;是一种辅酶Ⅰ&#xff08;NAD&#xff09;的前体&#xff0c;也是…

Python魔法之旅-魔法方法(04)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

Idea的相关操作

1、关闭自动更新 点击左上角File->Setting&#xff0c;进入配置页面&#xff0c;点击Appearance & Behavior > System Settings > Updates&#xff0c;取消勾选更新选项&#xff0c;如图&#xff1b; 2、代码提示忽略大小写 点击左上角File->Setting&#xf…

Llama 3-V: 比GPT4-V小100倍的SOTA

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

【目标检测】基于深度学习的植物中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码 MX_001期】

系统简介&#xff1a; 这是一款基于深度学习技术的植物草药智能识别系统。系统通过分析植物草药的图像&#xff0c;能够准确地识别出不同种类的草药&#xff0c;并提供相关的信息和用途。用户只需将植物草药的图像上传至系统&#xff0c;即可快速获得识别结果。 系统利用先进…

海关接口源码:跨境贸易的数字桥梁

在全球化贸易日益频繁的今天&#xff0c;海关接口源码成为了促进国际贸易的关键技术之一。它不仅提高了通关效率&#xff0c;还确保了贸易数据的准确性和安全性。本文将探讨海关接口源码的重要性、功能以及其在现代贸易中的作用。 一、海关接口源码的重要性 海关接口源码是一…