解析 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…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...

ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...