解析 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…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
