在 MySQL 中,SQL 优化是性能调优的核心环节,尤其是在数据量大、并发高的情况下。这里整理一份 MySQL 常见 SQL 语句优化指南,从查询写法、索引使用到执行计划分析,涵盖实用技巧:


1. 查询语句层面的优化

✅ 避免 SELECT *

  • 问题:会取出不必要的列,增加 I/O 和网络传输。
  • 优化:只取需要的列。
-- 不推荐
SELECT * FROM user;-- 推荐
SELECT id, username, email FROM user;

✅ 减少子查询,优先使用 JOIN

  • 问题:子查询可能生成临时表,效率低。
  • 优化:能用 JOIN 就不用子查询。
-- 子查询
SELECT name FROM employee WHERE dept_id IN (SELECT id FROM department WHERE name = '研发部'
);-- JOIN 优化
SELECT e.name 
FROM employee e 
JOIN department d ON e.dept_id = d.id
WHERE d.name = '研发部';

✅ 合理使用 LIMIT

  • 问题LIMIT offset, size 偏移量大时性能差。
  • 优化:利用索引字段加条件过滤。
-- 慢
SELECT * FROM orders LIMIT 100000, 20;-- 推荐(基于自增主键优化)
SELECT * FROM orders 
WHERE id > 100000 
LIMIT 20;

✅ 避免 OR,改用 INUNION ALL

  • 问题OR 会导致索引失效。
  • 优化:使用 INUNION ALL
-- 不推荐
SELECT * FROM user WHERE status = 1 OR status = 2;-- 推荐
SELECT * FROM user WHERE status IN (1, 2);

✅ 模糊查询优化

  • 问题LIKE '%abc' 不能走索引。

  • 优化

    • 改写为 LIKE 'abc%'(前缀匹配可以走索引)。
    • 或者使用 全文索引 (FULLTEXT) / ElasticSearch。
-- 慢
SELECT * FROM article WHERE title LIKE '%优化%';-- 推荐
ALTER TABLE article ADD FULLTEXT(title);
SELECT * FROM article WHERE MATCH(title) AGAINST('优化');

✅ 避免在 WHERE 中对列做函数运算

  • 问题:索引失效。
  • 优化:把函数移到等式右边。
-- 不推荐
SELECT * FROM user WHERE YEAR(create_time) = 2024;-- 推荐
SELECT * FROM user 
WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01';

2. 索引使用优化

✅ 建立合适的索引

  • 单列索引:适合高频查询字段。
  • 复合索引:遵循 最左前缀原则
CREATE INDEX idx_user_email ON user(email);
CREATE INDEX idx_order_user_time ON orders(user_id, create_time);

✅ 覆盖索引 (Covering Index)

  • 查询字段都在索引中,不需要回表。
-- 索引包含 (user_id, create_time)
SELECT user_id, create_time 
FROM orders 
WHERE user_id = 123;

✅ 避免过多索引

  • 问题:索引会增加写操作开销。
  • 优化:只在查询频繁的字段建索引,删除无用索引。

3. 执行计划分析

✅ 使用 EXPLAIN

分析查询是否走索引。

EXPLAIN SELECT * FROM orders WHERE user_id = 100;

重点关注字段:

  • type:优先级 system > const > eq_ref > ref > range > index > ALL
  • key:实际使用的索引
  • rows:扫描行数,越少越好

4. 表结构与数据优化

  • 分库分表:大表 (>千万行) 考虑拆分。
  • 冷热数据分离:历史数据归档,减少主表数据量。
  • 合理字段类型:能用 INT 不用 BIGINT,能用 CHAR(10) 不用 VARCHAR(255)

5. 常见优化 checklist

  • 是否避免了 SELECT *
  • 是否有合适的索引
  • 是否避免在索引列上使用函数、计算
  • 是否避免大 offset 的分页
  • 是否利用了 EXPLAIN 分析执行计划

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

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

相关文章

Golang 面试题「高级」

以下是 100 道 Golang 高级面试题及答案&#xff0c;聚焦语言底层实现、并发深度优化、性能调优、源码级理解等核心方向&#xff0c;适合资深开发者或架构师级别的面试场景&#xff1a; 一、GPM 调度模型与并发深度 问题&#xff1a;Goroutine 的栈空间初始大小是多少&#xff…

WebGIS视角:体感温度实证,哪座“火炉”火力全开?

目录 前言 一、火炉城市空间分布及特点 1、空间分布 2、气候特点 二、数据来源及技术实现 1、数据来源介绍 2、技术路线简介 三、WebGIS系统实现 1、后端设计与实现 2、前端程序实现 四、成果展示 1、整体展示 2、蒸烤模式城市 3、舒适城市 五、总结 前言 “火炉…

《数据结构入门:顺序表的结构设计与核心操作(C 语言版)》

目录 一. 线性表 二. 顺序表的概念与结构 2.1 核心概念 2.2 两种常见结构 静态顺序表 动态顺序表 2.3 核心区别对比 四. 顺序表的实现 4.1 顺序表的定义 4.2 顺序表初始化 4.3 动态顺序表容量检查与扩容 4.4 动态顺序表插入数据 4.4.1 头插 4.4.2 尾插 4.4.3 指…

[Maven 基础课程]Maven 是什么

Maven 的官方网站&#xff1a;https://maven.apache.org/ 来自 Maven 官网的对于 Maven 是什么的描述&#xff1a; Apache Maven is a build tool for Java projects. Using a project object model (POM), Maven manages a project’s compilation, testing, and documentat…

【MATLAB例程】三维组合导航,滤波使用EKF,带严格的惯导推算、雅克比求解函数,图像对比滤波前后的速度、位置、姿态

文章目录程序介绍系统建模滤波框架仿真设置性能对比代码优点运行结果MATLAB源代码程序介绍 本程序实现了 三维状态量的扩展卡尔曼滤波&#xff08;EKF&#xff09;组合导航仿真&#xff0c;采用严格的15维误差状态模型&#xff0c;状态向量包括&#xff1a; x[pxpypzvxvyvzϕθ…

港资企业在大陆,如何靠 SD-WAN 专线畅连香港?

在当前市场形势下&#xff0c;港资企业在大陆的业务布局不断拓展&#xff0c;企业间访问香港总部系统以及香港员工到内陆出差时访问相关系统&#xff0c;成为日常运营的高频需求。然而&#xff0c;网络问题却常常阻碍业务的顺畅开展&#xff0c;基于 SD-WAN 专线的到香港加速网…

并发编程——08 Semaphore源码分析

1 概述Semaphore 是基于 AQS CAS 实现的&#xff0c;可根据构造参数的布尔值&#xff0c;选择使用公平锁&#xff0c;还是非公平锁。Semaphore 默认使用非公平锁&#xff1b;2 构造函数 // AQS的实现 private final Sync sync;// 默认使用非公平锁 public Semaphore(int permi…

Java全栈开发面试实战:从基础到微服务的深度解析

Java全栈开发面试实战&#xff1a;从基础到微服务的深度解析 一、面试开场 面试官&#xff08;中年工程师&#xff0c;穿着休闲但专业&#xff09;&#xff1a;你好&#xff0c;我是李工&#xff0c;今天来聊一下你的技术背景。你之前在XX科技做全栈开发&#xff0c;对吧&#…

CVPR深度学习论文创新合集拆解:模型训练速度算提升

关注gongzhonghao【CVPR顶会精选】大语言模型扩散Transformer的深度融合&#xff0c;让文本到图像生成更精准、细节更丰富&#xff1b;同时&#xff0c;专家轨迹正则化深度强化学习在自动对焦中的稳定加速表现&#xff0c;也展示了深度学习与轨迹建模结合的潜力。这样的组合正在…

【智能体】零代码学习 Coze 智能体(2)创建智能体的完整步骤

欢迎关注【AGI使用教程】 专栏 【智能体】零代码学习 Coze 智能体&#xff08;1&#xff09; 【智能体】零代码学习 Coze 智能体&#xff08;2&#xff09; 【智能体】零代码学习 Coze 智能体&#xff08;1&#xff09;1、登录 Coze 平台2、创建智能体3、智能体编排页面4、编写…

WPF和WinFrom区别

WPF 总结Windows Presentation Foundation (WPF) 是微软开发的一个用于构建 Windows 桌面应用程序的用户界面框架。它基于 .NET Framework&#xff0c;提供丰富的图形、动画和数据绑定功能&#xff0c;帮助开发者创建现代化、高性能的应用程序。以下是其核心要点总结&#xff1…

数据库原理及应用_数据库基础_第3章数据库编程_常用系统函数

前言 "<数据库原理及应用>(MySQL版)".以下称为"本书"中3.1.2节内容 引入 数据库常用系统函数的分析.上一篇帖子分析了,数据库函数需要看看能否被C语言函数替代 1.字符串函数 1)计算字符串字符数的函数和字符串长度的函数 语法: CHAR_LENGTH(str)…

回归问题的损失函数

简单来说&#xff0c;​在回归问题中&#xff0c;最常用的损失函数是均方误差&#xff08;MSE, Mean Squared Error&#xff09;和平均绝对误差&#xff08;MAE, Mean Absolute Error&#xff09;​。它们衡量的都是模型预测值&#xff08;ŷ&#xff09;与真实值&#xff08;y…

吴恩达机器学习(四)

一、神经网络神经元模拟逻辑单元&#xff1a;神经网络简单模型&#xff1a;神经网络中的前向传播过程&#xff1a;依次计算激活项&#xff0c;从输入层到隐藏层再到输出层的过程。样例&#xff1a;多元分类&#xff1a;

【重学 MySQL】九十三、MySQL的字符集的修改与底层原理详解

【重学 MySQL】九十三、MySQL的字符集的修改与底层原理详解一、字符集修改方法1. **配置文件修改**2. **SQL命令修改**3. **数据迁移方案**二、底层原理与注意事项1. **字符集与排序规则**2. **存储与性能影响**3. **数据一致性风险**三、常见问题解决1. **乱码问题**2. **性能…

pdf 转图片工具实现

一、安装 sudo yum install poppler-utils pdftoppm -v pdftoppm -png -r 300 a.pdf /tmp/page 运行效果&#xff1a; PDF转图片工具 - 在线PDF转PNG/JPG/TIFF转换器 | 免费在线工具 后台实现&#xff1a; using System.Diagnostics; using System.IO.Compression;namespac…

Zynq开发实践(FPGA之输入、输出整合)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】fpga开发的时候习惯上先把功能拆分成若干个模块。针对这些模块&#xff0c;一个一、个实现好之后&#xff0c;再用wire连接即可。这一点有点像软件编…

【Linux基础】深入理解计算机启动原理:MBR主引导记录详解

目录 引言 1 硬盘分区初始化概述 1.1 为什么需要硬盘分区 1.2 硬盘分区格式的发展 1.3 分区初始化的基本流程 2 MBR详解 2.1 MBR的定义与位置 2.2 MBR的结构详解 2.3 分区表结构详解 2.4 MBR的工作原理 2.5 MBR的引导程序 3 MBR的局限性 3.1 硬盘容量限制 3.2 分…

Linux 线程同步

线程同步 由于线程共享内存&#xff0c;访问共享数据&#xff08;全局变量、堆内存&#xff09;必须进行同步&#xff0c;以防止竞态条件&#xff08;Race Conditions&#xff09;导致数据不一致或程序崩溃。 子线程没有独立的地址空间&#xff0c;数据通常是共享的&#xff1b…

世界模型的典型框架与分类

1.概述 人类和动物智能的一个重要方面是我们对世界的内部模型。我们使用这个模型来预测我们的行为将如何影响我们的环境&#xff0c;预测未来的事件&#xff0c;并计划复杂的行动序列以实现目标。当前大多数机器学习研究都集中在被动理解数据的模型上&#xff0c;例如图像分类…