MySQL 调优技巧|索引什么时候失效?为什么?

写在前面

优化慢SQL,这是在工作或者面试中都不可避免的问题。这篇文章我们就来讲讲慢SQL的优化的一些方法!

1. 升配

最简单的一步就是升配!!当然在降本增效的当下,很难能将这种单子审批下来了!

2. 索引

MySQL一般会使用innodb作为存储引擎,而innodb存储引擎的索引结构为B+树,索引有啥用?

mysql的数据是存储在磁盘里的,而磁盘的io的随机读写是很慢的,因为需要不断的寻道,而索引是为了加速查询的速度。

B+树的结构如下:叶子结点存储数值,非叶子结点存储指针和键值

在这里插入图片描述

如果我们不加索引,MySQL就会进行全表扫描!如果加了索引,那么B+树就会进行走索引!那么就会少走很多的磁盘io。

现在我们知道了为什么建索引,但并不是所有的字段都需要或者都需要建立索引的,因为索引也是占空间的,而且索引是有时候也会失效的! 也会影响到更新速度,这被称为过度索引了,那么什么字段适合建立索引?什么字段不适合建立索引呢?

3. 什么字段适合建立索引?

大体可有以下四种情况:

  1. 针对查询比较频繁字段做索引,并且尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
  2. 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以索引覆盖,避免回表,提高查询效率
  3. 索引应该建立在小字段上,对于大的文本字段不要建立索引。
  4. 要控制索引的数量,索引过多,维护索引结构的代价很大,会影响增删改的效率

B+树的本质是一颗平衡树,当底层的数据量过大的时候,索引就会向上分裂,再合并,从而形成层。如果我们对性别这一类的字段建立索引,就会出现以下这种情况,这种情况其实和扫全表没啥区别了,反而还浪费了空间。

在这里插入图片描述
而如果是对一些重复度不高、唯一性很强的字段,比如用户唯一id这种,建立索引,那么能很快速的找到这个数据。比如以下这种索引
在这里插入图片描述

3. 什么时候索引会失效?为什么?

3.1 使用了不等号(<> 或 !=)

SELECT id,username FROM user WHERE age <> 18;

索引适合用于查找具体值或范围值,如 =, <, >, BETWEEN 等操作,而 <> 或 != 运算符要求 MySQL 查找所有不等于某个值的记录,范围模糊且不能明确定位,索引不能高效定位这些记录。`

3.2 OR 连接多个条件

SELECT id,username FROM user WHERE user_id = 1 OR age = 18;

当使用 OR 连接多个条件时,MySQL 可能无法有效地使用索引。为什么是可能?因为OR走索引与否,还和优化器的预估有关,就算连接条件都设置了索引,也可能因为回表导致索引失效

  • 索引 + OR + 无索引的列:会先走索引列,但无索引的列会进行全表扫描,所以还不如不走索引,直接都全表扫描完事。
  • 索引 + OR + 索引,那么可能走索引,也可能不走索引。

MySQL 会尝试分别使用每个条件的索引,然后将结果合并,往往效率较低。解决方法其实很简单,只需要将OR拆开,用UNION、UNION ALL拼接起来。

改成

SELECT id,username FROM user WHERE user_id = 1
UNION
SELECT id,username FROM user WHERE age = 18;

3.3 对索引列进行函数操作

当对索引列应用函数(如 UPPER(), YEAR(), CONCAT() 等),MySQL 不能直接在索引中查找优化后的数据,而是必须先计算函数结果,然后再去查找匹配的行。这会使得索引失效。

eg:

SELECT id,username FROM user WHERE YEAR(birthdate) = 2024;

在这里插入图片描述
这里YEAR(birthdate) 是一个函数,MySQL 不能直接利用 birthdate 列上的索引进行查询,而需要先计算 YEAR(birthdate),导致索引失效。

3.4 隐式类型转换

当查询条件中的数据类型与表字段的数据类型不匹配时,MySQL 会进行隐式类型转换。在这个过程中,可能导致索引失效,因为索引是基于特定的数据类型创建的,类型转换后,可能无法高效利用索引。

eg:假设age是整数类型,但是却使用字符串类型

SELECT * FROM user WHERE age = '20';

MySQL 需要在查询时转换 ‘20’ 为整数类型,可能会导致索引无法使用。 某个电商平台就有这么一个类似的bug,导致下单超时崩盘30分钟。

在这里插入图片描述

3.5 范围查询与其他条件混合

如果一个复合索引包含多个列,并且查询中有范围条件,如 BETWEEN, >, <,MySQL 会优先根据范围条件来 定位数据,而忽略其他条件。这种情况下,索引可能只会应用于范围条件的列,其他列无法有效利用索引。

示例:

SELECT id,username FROM user WHERE birthdate > '2024-01-01' AND age = 18;

假设有一个复合索引 (birthdate, age),由于 birthdate > ‘2024-01-01’ 是一个范围查询,MySQL 只会使用 birthdate 列的索引,而 age 列则可能无法使用索引。

解决方法:尽量避免范围查询和精确查询混合在同一个条件中,或者重新设计索引顺序以适应查询的特点。

eg:改成复合索引为 (age,birthdate) 并且SQL语句如下:

SELECT id,username FROM user WHERE age = 18 AND birthdate > '2024-01-01';

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

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

相关文章

有线通信与无线通信技术的深度剖析与比较

有线通信与无线通信技术的深度剖析与比较 摘要&#xff1a; 本文详细阐述了有线通信技术和无线通信技术的原理、特点、应用场景、技术标准以及发展趋势等方面的内容&#xff0c;并对二者进行了深入的比较分析。通过全面探讨&#xff0c;旨在使读者清晰地理解这两种通信技术的差…

ARM/Linux嵌入式面经(五五):未岚大陆

文章目录 0、项目中既有flash又有E2,为什么不只使用一个?问题回答:1、uart通信与i2c通讯的硬件区别;2、说说你理解的pid算法;问题回答3、串口转usb怎么实现的?问题回答:4、软件采集的adc数据有没有滤波;问题回答5、是否使用过boot?你觉得使用boot的注意事项是什么?问…

《封装继承与多态》封装的优势

文章目录 封装在面向对象编程中的优势1. 提高代码的可读性和可维护性2. 提高代码的安全性3. 降低代码的复杂性案例举例 封装在敏捷开发和团队合作中的优势1. 促进敏捷开发2. 促进团队合作案例举例 封装在面向对象编程中的优势 封装是面向对象编程&#xff08;Object-Oriented …

高级Python游戏开发:创建一款多人对战坦克大战

在本教程中,我们将用Python的Pygame库开发一款高级的坦克大战游戏。这款游戏支持多人对战、碰撞检测、子弹射击以及地图障碍生成,适合作为学习Python高级游戏开发的练习项目。 一、游戏功能概述 多人对战模式:玩家可以操作坦克,在同一屏幕上互相攻击。子弹射击:坦克可以发…

【芯片设计- RTL 数字逻辑设计入门 番外篇 7.1 -- 基于ATE的IC测试原理】

文章目录 ATE 测试概述Opens/Shorts测试Leakage测试AC测试转自:漫谈大千世界 漫谈大千世界 2024年10月23日 23:17 湖北 ATE 测试概述 ATE(Automatic Test Equipment)是用于检测集成电路(IC)功能完整性的自动测试设备。它在半导体产业中扮演着至关重要的角色,主要用于检…

WPF+MVVM案例实战与特效(三十九)- 深度剖析一个弧形进度条的实现

文章目录 1、使用 Path 结合 ArcSegment 绘制圆弧1、属性解读2、静态圆弧3、动态圆弧4、运行效果5、圆弧两端点的形状2、总结1、使用 Path 结合 ArcSegment 绘制圆弧 1、属性解读 Path 是 WPF 中的一个标记元素,用于绘制复杂的几何路径形状,而 ArcSegment 用于描述 Path 中…

YOLOv5-Backbone模块实现

YOLOv5-Backbone模块实现 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#xff1a…

软件需求规格说明书文档,系统需求规格说明书下载,软件工程需求规格案例模板参考(word原件)

1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需求 3.9 环境需求…

青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序

青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序 课题摘要:一、Web应用程序二、Web服务器&#xff08;一&#xff09;什么是Web服务器&#xff08;二&#xff09;Web服务器配置1. 选择服务器软件2. 安装服务器软件3. 配置服务器4. 安全设置5. 部署网站内容6. 测试服…

Linux - MySQL迁移至一主一从

Linux - MySQL迁移至一主一从 迁移准备安装MySQL ibd文件迁移原服务器操作目标服务器操作 一主一从增量同步异常解决结尾 首先部分单独安装MySQL&#xff0c;请参考Linux - MySQL安装&#xff0c;迁移数据量比较大约400G左右且网络不通故使用文件迁移&#xff0c;需开启一段时间…

29. Three.js案例-自定义平面图形

29. Three.js案例-自定义平面图形 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它利用 WebGL 技术在浏览器中渲染 3D 图形。 构造器 THREE.WebGLRenderer(parameters : object) 参数类型描述parametersobject可选参数对象&…

SpringBoot开发——集成Java审计日志工具Spring Data Envers

文章目录 一、Spring Data Envers是什么二、集成步骤1、添加依赖2、然后在启动类上添加启用注解3、创建一个审计实体4、使用审计仓库5、高级功能 三、总结 一、Spring Data Envers是什么 Spring Data Envers是Spring Data家族中专门负责数据审计的成员。它基于Hibernate Enver…

大模型运用-Prompt Engineering(提示工程)

什么是提示工程 提示工程 提示工程也叫指令工程&#xff0c;涉及到如何设计、优化和管理这些Prompt&#xff0c;以确保AI模型能够准确、高效地执行用户的指令&#xff0c;如&#xff1a;讲个笑话、java写个排序算法等 使用目的 1.获得具体问题的具体结果。&#xff08;如&…

MTK Android12 更换开机LOGO和开机动画

1、路径&#xff1a; &#xff08;1&#xff09;device/mediatek/system/common/device.mk &#xff08;2&#xff09;vendor/audio-logo/animation/bootanimation.zip &#xff08;3&#xff09;vendor/audio-logo/products/resource-copy.mk &#xff08;4&#xff09;vendo…

嵌入式驱动开发详解16(音频驱动开发)

文章目录 前言WM8960简介I2S协议接口说明 SAI音频接口简介驱动框架简介设备树配置内核使能声卡设置与测试 后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发&#xff0c;但是由于ALSA驱动框架过于复杂&#xff0c;实现音频编解码芯片的驱动不是一个人能完成的&#xf…

[146 LRU缓存](https://leetcode.cn/problems/lru-cache/)

分析 维护一个双向链表保存缓存中的元素。 如果元素超过容量阈值&#xff0c;则删除最久未使用的元素。为了实现这个功能&#xff0c;将get(), put()方法获取的元素添加到链表首部。 为了在O(1)时间复杂度执行get()方法&#xff0c;再新建一个映射表&#xff0c;缓存key与链表…

learn-(Uni-app)输入框u-search父子组件与input输入框(防抖与搜索触发)

1.父子组件u-search &#xff08;1&#xff09;父组件 <!-- 父组件 --> <template> <div><searchBar change"change" search"search"></searchBar> </div> </template> <script> // 子组件搜索 import…

计算机进制的介绍

一.进制介绍 对于整数&#xff0c;有四种表示方式: 1&#xff09;二进制:0,1&#xff0c;满2进1。 在golang中&#xff0c;不能直接使用二进制来表示一个整数&#xff0c;它沿用了c的特点。 参考:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 //赋值…

嵌入式 linux Git常用命令 抽补丁 打补丁

Git常用命令 为什么要学习git呢&#xff1f;我相信刚入门的小伙伴敲打肯定碰到过这种玄学问题&#xff0c;我明明刚刚还能用的代码&#xff0c;后面不知道咋的就不能用了&#xff0c;所以每次你调出一个功能点以后都会手动复制一份代码防止出问题&#xff0c;时间一长发现整个…

Transformers参数高效微调之LoRA

简介 LoRA: Low-Rank Adaptation of Large Language Models是微软研究人员为处理微调大语言模型的问题而引入的一项新技术。具有数十亿个参数的强大模型&#xff08;例如 GPT-3&#xff09;为了适应特定任务或领域而进行微调的成本非常高。LoRA 建议冻结预先训练的模型权重并注…