解析 MySQL 查询优化:提升性能的十个关键策略
1. 避免全表扫描
当查询的数据量非常大时,全表扫描的效率会很低。应尽量通过在WHERE
和ORDER BY
涉及的列上创建索引,避免全表扫描。索引就像一本书的目录,可以快速定位到需要的数据,而不用从头开始逐页查找。
示例: 如果没有索引,查询所有年龄为25岁的用户时,MySQL需要扫描整个users
表中的每一行。 通过在age
字段上建立索引,查询可以直接跳到符合条件的数据行,极大提高查询速度。
注意:在小表中全表扫描的代价较小,通常不需要创建过多的索引,但在大表中,全表扫描会显著拖慢查询速度。
2. 避免NULL值判断
在WHERE
子句中,如果对字段进行NULL
值判断,索引将不起作用。为了避免这个问题,设计表结构时尽量避免使用NULL
值。可以通过设置NOT NULL
约束或为该字段设置特殊的默认值(如0
或-1
)来代替NULL
。
示例: 查询所有名字不为空的用户时,如果字段name
允许为NULL
,查询性能将会降低。因此在表设计时,字段应尽可能设置为NOT NULL
,且给定合适的默认值。
原因:MySQL在处理NULL
值时,无法有效使用索引。因此,如果可以避免使用NULL
值,可以显著提高查询性能。
3. 避免 != 或 <> 操作符
在WHERE
子句中使用!=
或<>
操作符会使MySQL无法使用索引,因为这些操作符的匹配模式使得MySQL无法快速过滤出特定的数据集。最好使用=
、<
、>
等支持索引的操作符。
示例: 避免查询所有不等于某个值的记录,而是通过重新设计查询逻辑来利用索引。比如将“查找不等于10
的记录”重新设计为“查找大于10
的记录”。
4. 避免OR条件
在WHERE
子句中使用OR
条件会导致MySQL放弃索引,转而进行全表扫描。优化的方式是通过UNION
来将多个查询合并,或者拆分查询逻辑。
示例: 避免这种查询:
SELECT id FROM users WHERE age = 25 OR age = 30;
可以将其优化为两个独立的查询,通过UNION
来合并结果,且各自的查询均可以使用索引。
注意:当涉及多个字段时,可以通过重写WHERE
条件来避免OR
,从而提升性能。
5. 谨慎使用IN和NOT IN
IN
和NOT IN
操作符在处理大集合时,可能导致全表扫描,特别是当IN
内包含大量非连续的值时。为了提高性能,可以用BETWEEN
来替代IN
,特别是在查询范围较小时。
示例: 避免这种情况:
SELECT id FROM users WHERE age IN (25, 26, 27);
可以优化为
SELECT id FROM users WHERE age BETWEEN 25 AND 27;
原因:BETWEEN
查询通常比IN
更加高效,尤其在索引列上执行时,性能差距更加明显。
6. LIKE查询优化
LIKE
查询在处理部分匹配时可能导致全表扫描。尤其是在使用通配符%
作为开头时(如%abc%
),MySQL无法使用索引,因为需要逐行匹配整个字符串。
示例: 避免使用%abc%
或%abc
形式的查询,最好限制通配符只在后缀位置(如abc%
),这样MySQL可以有效利用索引来加速查询。
建议:对于复杂的字符串匹配需求,可以考虑使用全文检索功能,它比简单的LIKE
查询要高效得多。
7. 避免参数化查询导致全表扫描
在某些情况下,参数化查询可能会让MySQL无法充分利用索引,从而导致全表扫描。可以通过在查询中明确指定使用的索引来避免这个问题。
示例: 在查询时明确指定索引,确保查询能尽可能利用已有的索引结构。
原因:MySQL的查询优化器有时在面对参数化查询时无法充分确定使用哪个索引,这可能导致性能下降。
8. 避免表达式操作
在WHERE
子句中对字段进行表达式操作(如计算或函数调用)会使得索引失效,从而导致全表扫描。应避免在查询条件中使用这样的操作。
示例: 如果需要对某个字段进行计算,最好在应用程序层完成计算,并将结果传递给查询,而不是在查询中进行计算或使用函数。
原因:表达式操作会导致MySQL无法直接使用索引,因此在设计查询时尽量避免在WHERE
中进行字段操作。
9. 使用EXISTS替代IN
当涉及子查询时,EXISTS
比IN
在某些情况下效率更高,因为EXISTS
一旦找到符合条件的记录,就会停止进一步的查找,而IN
则必须先执行整个子查询,然后将结果返回。
示例: 当处理子查询时,EXISTS
子句通常会比IN
更高效,特别是在大数据集的情况下。
原因:EXISTS
执行时可以在找到第一条符合条件的记录时就立即返回结果,而不需要遍历所有数据。
10. 索引数量控制
虽然索引能够加快SELECT
查询的速度,但过多的索引会影响表的INSERT
和UPDATE
操作性能。因为每次数据的插入、更新、删除操作都会涉及索引的同步更新。通常一个表的索引数量最好不超过6个,且应合理选择哪些列需要创建索引。
建议:
- 根据业务需求,合理设计索引。对于频繁用于查询的列应创建索引,而对于不常查询或频繁更新的列,索引的创建应慎重考虑。
- 索引的设计应结合查询场景和表结构,避免盲目创建过多的索引。
原因:虽然索引能提升查询速度,但也会增加维护索引的成本,过多的索引会导致写入性能下降,因此需要在查询效率和写入效率之间找到平衡。
相关文章:
解析 MySQL 查询优化:提升性能的十个关键策略
1. 避免全表扫描 当查询的数据量非常大时,全表扫描的效率会很低。应尽量通过在WHERE和ORDER BY涉及的列上创建索引,避免全表扫描。索引就像一本书的目录,可以快速定位到需要的数据,而不用从头开始逐页查找。 示例: 如…...

QT--QPushButton设置文本和图标、使能禁能、信号演示
按钮除了可以设置显示文本之外,还可以设置图标 文本 可以获取和设置按钮上显示的文本 // 获取和设置按钮的文本 QString text() const void setText(const QString &text)该属性,既可以在 Qt 设计师右侧的属性窗口中修改,也可以在代码…...

PostgreSQL学习笔记六:模式SCHEMA
模式(Schema) PostgreSQL中的模式(Schema)是一个命名的数据库对象集合,包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象,使得同一个数据库中可以包含…...

基础IO -- 理解文件(1)
目录 一:回顾文件 二:加深对文件的理解 1.概念 2.以w写方式打开 3.以a追加方式打开 4.重定向 一:回顾文件 以前学习过在C语言中的文件操作, 但那根本是不足以理解文件的,即站在语言角度是不可能理解文件的 我们要…...

golang包管理
package 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何导入其他包。 包与依赖管理 本章学习目标 掌握包的定义和使用掌握init初始化函数的使用掌握…...

outlook 添加企业邮箱账号出现 553 authentication is required 错误解决
系统报错如下 问题原因 发件服务器身份验证设置错误,或者未勾选发送服务器验证的选项。 解决方案 Outlook客户端 本文以Outlook 2016为例,具体操如下: 1、在Outlook客户端的电子邮件设置窗口中,单击其他设置; 2、…...
一个开源可本地部署的英文翻译服务----EnToZhAPI
EnToZhAPI项目简介 项目背景 提供本地化的英文翻译服务API。支持单句翻译请求或者批量翻译请求。支持建立查询词汇表。 项目架构 前端:使用原生js,使用MDB作为CSS框架。django模板引擎渲染可视化界面。 后端:使用waitress作为后端服务器…...
【unity】编辑器扩展——在OnValidate中创建、删除游戏物体
我们知道在OnValidate中创建游戏物体会发出警告,删除游戏物体会报错。 所以我们使用协程,将开始动作的信号放在OnValidate中,将动作的执行放在帧结尾。 参考代码如下: using System.Collections; using UnityEngine;public clas…...
学习记录:js算法(六十四):最后一块石头的重量
文章目录 最后一块石头的重量思路一思路二 最后一块石头的重量 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。那么粉碎的可能结果如…...
单片机探秘:从理论到应用
单片机探秘:从理论到应用 在这个科技飞速发展的时代,单片机的应用如同一颗璀璨的星星,照亮了我们生活的方方面面。今天,让我们一同深入探讨单片机的原理与应用,揭开这个技术领域的神秘面纱。 1. 单片机概述 1.1 什么…...
options妙用
options妙用 设置默认浏览器为 Chrome options(browser “chrome”) 再次尝试运行 igsva() res <- igsva() 加载 BiocManager library(BiocManager) 设置超时时间 options(timeout 3600) 安装包 BiocManager::install(c(“org.Hs.eg.db”, “org.Mm.eg.db”)) …...

UE5 圆周运动、贝塞尔曲线运动、贝塞尔曲线点
圆周运动 贝塞尔曲线路径运动 蓝图函数库创建贝塞尔曲线点 // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "MyB…...
线程局部存储(TLS)
很多时候,我们可能想存储一些线程的私有数据,属于线程的私有变量有局部变量,函数的参数,假如我们要在线程中存储全局变量,多个线程访问都对这个变量有自己的一个副本。 一、隐式实现 __thread int a; //linux __dec…...

JavaSE——集合7:Set接口实现类—TreeSet
目录 一、TreeSet基本介绍 二、TreeSet核心方法 三、TreeSet排序方法 四、TreeSet源码解析 1.无参构造时,底层是创建TreeMap对象 2.有参构造时,底层也创建TreeMap对象 3.执行add方法 4.执行put方法 一、TreeSet基本介绍 TreeSet是 Java 集合框架…...

【idea技巧篇】idea的类注释和方法注释模版自定义设置
这块idea技巧虽然常用,谁没事会经常修改模版设置呢,一般是搭建开发环境的时候或者开发规范要求等设置一次就行了。用的虽然少,但几乎每次搭建环境都会用到,这里记录下并分享设置的过程已经发现的更高级的一些使用技巧。 注释模版…...

【Kubernetes① 基础】一、容器基础
目录 一、进程二、隔离与限制三、容器镜像总结参考书籍 一、进程 容器技术的兴起源于PaaS技术(平台即服务)的普及;Docker公司发布的Docker项目具有里程碑式的意义;Docker项目通过“容器镜像”解决了应用打包这个根本性难题(CloudFoundry)。 容器本身的价…...

计算机网络第1章(概述)万字笔记详细版
1.1、计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水,电,煤气这些基础设施一样,成为我们生活中不可或缺的一部分 我国互联网发展状况 中国互联网络信息中心CNNIC 1.2、…...
每日一练算法题(堆串的基本操作StrReplace(S, T, V))
6-2 堆串的基本操作StrReplace(S, T, V) 编写算法,实现堆串的基本操作StrReplace(S, T, V)。 初始条件: 串S, T和 V 均已存在,且 V 是非空串。 操作结果: 用V替换主串S中出现的所有与(模式串)T相等的不重叠的子串。输入格式: 第一行:S 第二行&#…...

IRP默认最小流程
IRP是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的I/O请求转换成相应的IRP,不同的IRP会根据类型被分派到不同的派遣例程中进行处理。 irp相当于R3下的消息,…...

【全网最全】AI产品经理面试高频100题答案解析
详细的目录如下,需要的小伙伴可以详细看一下~ 第一章:机器学习和深度学习的关系 第二章:机器学习7大经典算法 算法一:K近邻算法【分类算法】 1.1 KNN 算法的实现原理 1.2 KNN应用场景举例:预测候选人能不能拿到 O…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...