Mysql在SQL层面的优化
以下是MySQL在SQL层面的优化方法及详细案例,结合实际场景说明如何通过调整SQL语句提升性能:
1. 确保索引有效使用
案例:订单状态查询优化
问题SQL:
SELECT * FROM orders WHERE status = 'shipped' AND create_time > '2023-01-01';
分析:
- 若
status
和create_time
字段无索引,会导致全表扫描。 - 通过
EXPLAIN
查看执行计划,发现type=ALL
(全表扫描)。
优化方法:
添加联合索引:
ALTER TABLE orders ADD INDEX idx_status_create_time (status, create_time);
优化后效果:
EXPLAIN
显示type=range
,索引生效,扫描行数大幅减少。
**2. 避免使用SELECT ***
案例:用户信息查询优化
问题SQL:
SELECT * FROM users WHERE age > 30;
问题:
SELECT *
会读取所有字段,包括不需要的文本字段(如description
),增加I/O和内存开销。
优化方法:
明确指定所需字段:
SELECT user_id, name, age FROM users WHERE age > 30;
优化后效果:
- 减少数据传输量,尤其对大文本字段场景性能提升显著。
3. 分页查询优化
案例:日志表分页慢
问题SQL:
SELECT * FROM logs ORDER BY id LIMIT 1000000, 10;
问题:
LIMIT 1000000, 10
会先扫描前1000010行,再丢弃前100万行,效率极低。
优化方法:
改用游标分页(基于上一页最后一条记录的ID):
SELECT * FROM logs WHERE id > 1000000 ORDER BY id LIMIT 10;
优化后效果:
- 直接通过索引定位到起始点,扫描行数从100万+降低到10行。
4. 优化JOIN操作
案例:订单与用户表关联查询
问题SQL:
SELECT * FROM orders
LEFT JOIN users ON orders.user_id = users.id
WHERE users.country = 'US';
问题:
- 若
users.country
无索引,会先全表扫描users
,再关联orders
表。
优化方法:
- 为
users.country
添加索引:ALTER TABLE users ADD INDEX idx_country (country);
- 调整查询顺序,小表驱动大表:
SELECT * FROM users STRAIGHT_JOIN orders ON users.id = orders.user_id WHERE users.country = 'US';
优化后效果:
users
表通过索引快速过滤,再关联orders
表,减少扫描数据量。
5. 子查询优化
案例:查询未支付订单
问题SQL:
SELECT * FROM orders
WHERE user_id IN (SELECT user_id FROM payments WHERE status = 'failed');
问题:
- MySQL可能对子查询进行全表扫描,尤其数据量大时性能差。
优化方法:
改写为JOIN
或EXISTS
:
-- 使用JOIN
SELECT o.* FROM orders o
INNER JOIN payments p ON o.user_id = p.user_id
WHERE p.status = 'failed';-- 使用EXISTS
SELECT * FROM orders o
WHERE EXISTS (SELECT 1 FROM payments p WHERE p.user_id = o.user_id AND p.status = 'failed'
);
优化后效果:
- 执行计划显示使用索引关联,避免全表扫描。
6. 避免索引失效操作
案例:日期范围查询
问题SQL:
SELECT * FROM logs WHERE DATE(create_time) = '2023-10-01';
问题:
- 对字段使用函数
DATE()
会导致索引失效。
优化方法:
改用范围查询:
SELECT * FROM logs
WHERE create_time >= '2023-10-01 00:00:00'
AND create_time < '2023-10-02 00:00:00';
优化后效果:
- 若
create_time
有索引,优化后查询可命中索引。
7. 利用覆盖索引
案例:统计用户数量
问题SQL:
SELECT COUNT(*) FROM users WHERE age > 30;
问题:
- 若
age
字段无索引,需全表扫描。
优化方法:
- 添加索引:
ALTER TABLE users ADD INDEX idx_age (age);
- 使用覆盖索引(索引包含查询所需字段):
SELECT COUNT(*) FROM users USE INDEX (idx_age) WHERE age > 30;
优化后效果:
- 直接从索引树统计数量,无需回表查数据行。
8. 减少全表排序(Using filesort)
案例:按姓名排序查询
问题SQL:
SELECT * FROM employees ORDER BY name LIMIT 1000;
问题:
- 若无
name
索引,需全表扫描后排序,产生Using filesort
。
优化方法:
添加索引:
ALTER TABLE employees ADD INDEX idx_name (name);
优化后效果:
EXPLAIN
显示Using index
,直接按索引顺序返回数据。
9. 批量插入优化
案例:导入大量数据
问题SQL:
INSERT INTO logs (message) VALUES ('msg1');
INSERT INTO logs (message) VALUES ('msg2');
... (重复1万次)
问题:
- 每次插入都提交事务,导致频繁I/O。
优化方法:
使用批量插入:
INSERT INTO logs (message) VALUES
('msg1'), ('msg2'), ..., ('msg10000');
优化后效果:
- 单次事务提交,减少磁盘I/O和锁竞争。
10. 类型匹配避免隐式转换
案例:按字符串ID查询
问题SQL:
SELECT * FROM products WHERE id = '100'; -- id为INT类型
问题:
- 字符串
'100'
与INT
类型不匹配,导致索引失效。
优化方法:
保持类型一致:
SELECT * FROM products WHERE id = 100;
优化后效果:
- 索引命中,避免全表扫描。
总结
SQL层面优化的核心原则:
- 索引为王:确保查询条件、JOIN字段、排序字段有合适索引。
- 减少数据量:避免不必要的数据传输(如
SELECT *
)。 - 避免索引失效:注意函数、类型转换、运算对索引的影响。
- 重写复杂查询:用JOIN替代子查询,用游标分页替代
LIMIT OFFSET
。
工具辅助:
- 使用
EXPLAIN
分析执行计划,关注type
、key
、rows
、Extra
列。 - 开启慢查询日志(
slow_query_log
)定位高频低效SQL。
相关文章:
Mysql在SQL层面的优化
以下是MySQL在SQL层面的优化方法及详细案例,结合实际场景说明如何通过调整SQL语句提升性能: 1. 确保索引有效使用 案例:订单状态查询优化 问题SQL: SELECT * FROM orders WHERE status shipped AND create_time > 2023-01-…...
JVM规范之栈帧
JVM规范之栈帧 前言正文概述局部变量表操作数栈动态链接 总结参考链接 前言 上一篇文章了解了JVM规范中的运行时数据区: JVM规范之运行时数据区域 其中,栈是JVM线程私有的内存区,栈中存储的单位是帧(frames)ÿ…...

【C++指南】string(四):编码
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 引言 在 C 编程中,处理字符串是一项极为常见的任务。而理解字符串在底层是如何编码存储的&…...

深度学习之序列建模的核心技术:LSTM架构深度解析与优化策略
LSTM深度解析 一、引言 在深度学习领域,循环神经网络(RNN)在处理序列数据方面具有独特的优势,例如语音识别、自然语言处理等任务。然而,传统的 RNN 在处理长序列数据时面临着严重的梯度消失问题,这使得网…...

AI量化交易是什么?它是如何重塑金融世界的?
第一章:证券交易的进化之路 1.1 从喊价到代码:交易方式的革命性转变 在电子交易普及之前,证券交易依赖于交易所内的公开喊价系统。交易员通过手势、喊话甚至身体语言传递买卖信息,这种模式虽然直观,但效率低下且容易…...

分布式事务处理方案
1. 使用Seata框架解决 1.1 XA 事务 1.1.1 XA整体流程 第一阶段 RM1开启XA事务-> 执行业务SQL -> 上报TC执行结果RM2开启XA事务-> 执行业务SQL -> 上报TC执行结果 第二阶段 TC根据 RM上报结果通知RM一起提交/回滚XA事务 1.1.2 XA特点 XA 模式必须要有数据库的支…...

CVE-2024-36467 Zabbix权限提升
漏洞描述 在Zabbix中,具有API访问权限的已认证用户(例如具有默认用户角色的用户)可以通过调用user.update API接口,将自己添加到任何用户组(如Zabbix管理员组)。然而,用户无法添加到已被禁用或…...

Dify中的自定义模型插件开发例子:以xinference为例
本文使用Dify v1.0.0-beta.1版本。模型插件结构基本是模型供应商(模型公司,比如siliconflow、xinference)- 模型分类(模型类型,比如llm、rerank、speech2text、text_embedding、tts)- 具体模型(…...
crud方法命名示例
以下是基于表名dste_project_indicator(项目指标表)的完整命名示例,覆盖各类增删改查场景: 1. 表名与实体类映射 // 表名:dste_project_indicator // 实体类:DsteProjectIndicatorEntity public class Ds…...

尚硅谷redis7 33-36 redis持久化之RDB优缺点及数据丢失案例
官网说明优点: RDB是Redis数据的一个非常紧凑的单文件时间点表示,RDB文件非常适合备份。例如,您可能希望在最近的24小时内每小时旧档一次RDB文件,并在30天内每天保存一个RDB快照,这使您可以在发生来难时轻松恢复不同版本的数据集。RDB非常适合灾难恢复,它是一个可以…...
No such file or directory: ‘ffprobe‘
目录 详细信息: 解决方法: No such file or directory: ffprobe 详细信息: File "/usr/local/lib/python3.10/dist-packages/framepump/framepump.py", line 168, in get_duration return float(ffmpeg.probe(video_path)[form…...

计算机网络-WebSocket/DNS/Cookie/Session/Token/Jwt/Nginx
文章目录 WebSocketDNS什么是dns域名解析底层协议 cookie/sessionToken/JWTNginx WebSocket 一种网络通信协议,允许在单个 TCP(半双工) 连接上进行全双工通信(客户端和服务器可同时双向传输数据)。 HTTP是基于请求-响…...
功能“递归模式”在 C# 7.3 中不可用,请使用 8.0 或更高的语言版本的一种兼容处理方案
原程序: internal class ControllerParameterCreator : IParameterCreator {private Controller controller;public ControllerParameterCreator(Controller controller){this.controller controller;}public Parameter CreateSystem(string name, int unused){re…...
第4章-操作系统知识
存储管理 固定分区:一种静态分区方式请求分页存储管理覆盖技术:覆盖技术是指让作业中不同时运行的程序模块共同使用同一主存区域。...

将网页带格式转化为PDF
# 一、安装插件 SingleFile | 将完整的页面保存到一个 HTML 文件中 – 下载 🦊 Firefox 扩展(zh-CN) 打开火狐浏览器,安装上面的插件 # 二、下载html单文件 打开对应的网页,点击插件下载对应的html文件 # 三、打开…...

【ArcGIS】ArcGIS AI 助手----复现
github地址 korporalK/Archer-GIS-AI-Assitant:Archer 在 ArcGIS Pro 中将自然语言命令转换为自动化 GIS 工作流。它使用代理框架(计划-验证-执行)构建并由 LLM 提供支持,可简化空间分析、减少手动工作并使 GIS 更易于访问。Arch…...
使用 FFmpeg 将视频转换为高质量 GIF(保留原始尺寸和帧率)
在制作教程动图、产品展示、前端 UI 演示等场景中,我们经常需要将视频转换为体积合适且清晰的 GIF 动图。本文将详细介绍如何使用 FFmpeg 工具将视频转为高质量 GIF,包括: ✅ 保留原视频尺寸或自定义缩放✅ 保留原始帧率或自定义帧率✅ 使用调色板优化色彩质量✅ 降低体积同…...
《Java vs Go vs C++ vs C:四门编程语言的深度对比》
引言 从底层硬件操作到云端分布式系统,Java、Go、C 和 C 四门语言各自占据不同生态位。本文从设计哲学、语法范式、性能特性、应用场景等维度进行对比,为开发者提供技术选型参考。 一、设计哲学与历史定位…...

充电枪IEC62196/EN 62196测试内容
充电枪IEC62196/EN 62196测试内容 一、机械性能测试 插拔力测试 交流充电接口的插入/拔出力需≤100N,直流接口≤140N。若使用助力装置,操作力仍需满足上述要求。 测试方法:通过弹簧秤或专用试验机(如Sun-CB设备)测…...
有效的字母异位符--LeetCode
题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat", t "car" 输出: false 思路一:排序 t 是 s …...

SAP ERP 系统拆分的七大挑战
在企业变革或管理运营风险时,剥离IT系统能带来显著效益,但SAP ERP系统的复杂性使得这项工作充满挑战。如果管理不当,可能会导致数据不一致、运营中断、合规风险和意外成本。由于SAP ERP系统深度集成于企业核心业务流程中,其拆分工…...

AcrelEMS 3.0智慧能源管理平台:构建企业微电网数智化中枢
安科瑞电气顾强 在"双碳"目标驱动下,企业能源管理正从粗放式运营向精细化、智能化转型。AcrelEMS 3.0智慧能源管理平台以微电网为核心载体,通过"感知-分析-决策-控制"的全链路数字化能力,助力工商企业、医疗机构、教育机…...
【HTML-12】HTML表格常用属性详解:从基础到高级应用
表格是HTML中最强大且常用的元素之一,它能够以结构化的方式展示数据。本文将全面介绍HTML表格的常用属性,帮助您创建美观、响应式且语义化的数据表格。 1. HTML表格基础结构 在深入了解属性之前,我们先回顾一下HTML表格的基本结构ÿ…...

Word转PDF--自动生成目录
1-Word文档中已经包含自动生成的目录; 2-选择“文件”; 3-另存为,PDF; 4-选择“选项”按钮,在弹出的窗口中,勾选“创建书签时使用标题”。...
MySQL组合索引优化策略
优化MySQL组合索引需要综合考虑查询模式、索引结构及数据库特性。以下是关键优化策略及示例: 1. 遵循最左前缀原则 策略:确保查询条件包含组合索引最左侧列。示例:索引(a,b,c)生效场景:WHERE a1 AND b2 -- ✔️ 使用a和b W…...
Spring MVC 的的核心原理与实践指南
一、Spring MVC 概述 Spring MVC 是 Spring 框架中的一个重要模块,用于构建基于 Java 的 Web 应用程序。它遵循模型-视图-控制器(MVC)设计模式,提供了一种结构化的方式来开发灵活、松耦合的 Web 应用。 Spring MVC 的特点…...

轻量级视觉语言模型 Dolphin:高效精准的文档结构化解析利器
在数字化办公和学术研究日益普及的今天,如何高效、准确地处理各类文档图像成为了一个亟需解决的问题。Dolphin 应运而生,作为一款基于异构锚点提示的多模态文档图像解析模型,它不仅打破了传统手动整理文档的繁琐流程,更以远超主流…...

如何安全配置数据库(MySQL/PostgreSQL/MongoDB)
数据库是许多应用程序的核心组成部分,因此保护数据库的安全性至关重要。无论是MySQL、PostgreSQL还是MongoDB,都需要经过适当的安全配置才能防止潜在的安全威胁。本文将介绍如何安全配置这些流行的数据库管理系统,以确保数据的保密性、完整性…...

将 Docker 镜像从服务器A迁移到服务器B的方法
在日常工作中,我们有时会需要将服务器 A上的镜像上传至服务器B上,下面给出具体操作方式,以镜像 postgres:15 为例进行讲解。 首先在服务器A上拉取 镜像 postgres:15 ,命令如下: docker pull postgres:15下面再将服务…...
git merge解冲突后,add、continue提交
git merge解冲突后,add、continue提交 git merge操作冲突后,需要手动解冲突,解完冲突后,需要: git add . 然后,进入一般的正常git代码提交流程。 git合并‘merge’其他分支的个别文件到当前branch_gitbash 合并branc…...