解析 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…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...
