mysql 语句优化

news/2026/1/19 14:34:17/文章来源:https://www.cnblogs.com/zqlmianshi/p/19501564

# MySQL 语句优化方式详解

## 📊 **一、SQL 编写优化**

### **1. 避免 SELECT ***
```sql
-- ❌ 不推荐
SELECT * FROM users WHERE status = 1;

-- ✅ 推荐:只取需要的列
SELECT id, name, email FROM users WHERE status = 1;
```

### **2. 使用 EXISTS 代替 IN**
```sql
-- ❌ 子查询数据量大时性能差
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);

-- ✅ 推荐:EXISTS 通常更高效
SELECT * FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.user_id = u.id AND o.amount > 1000
);

-- ✅ 更优:使用 JOIN
SELECT DISTINCT u.* FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.amount > 1000;
```

### **3. 避免在 WHERE 中使用函数**
```sql
-- ❌ 函数导致索引失效
SELECT * FROM orders WHERE DATE(create_time) = '2024-01-19';
SELECT * FROM users WHERE LOWER(name) = 'john';

-- ✅ 推荐:将函数移至右侧
SELECT * FROM orders
WHERE create_time >= '2024-01-19'
AND create_time < '2024-01-20';

SELECT * FROM users
WHERE name = 'JOHN' OR name = 'john'; -- 或存储时统一大小写
```

### **4. 使用 LIMIT 分页优化**
```sql
-- ❌ 传统分页(大数据量偏移时慢)
SELECT * FROM orders ORDER BY id LIMIT 1000000, 20;

-- ✅ 推荐:使用游标分页
SELECT * FROM orders
WHERE id > 1000000 -- 上次查询的最后一个id
ORDER BY id LIMIT 20;

-- ✅ 或使用覆盖索引
SELECT t.* FROM orders t
JOIN (SELECT id FROM orders ORDER BY id LIMIT 1000000, 20) tmp
ON t.id = tmp.id;
```

## 🔍 **二、索引优化**

### **1. 创建合适索引**
```sql
-- 多列查询时创建复合索引
-- ❌ 单列索引效率低
CREATE INDEX idx_user ON orders(user_id);
CREATE INDEX idx_status ON orders(status);

-- ✅ 推荐:复合索引(注意顺序)
CREATE INDEX idx_user_status ON orders(user_id, status);

-- 查询示例:可高效使用索引
EXPLAIN SELECT * FROM orders
WHERE user_id = 100 AND status = 1; -- 使用索引
EXPLAIN SELECT * FROM orders
WHERE status = 1; -- 无法使用索引(不满足最左前缀)
```

### **2. 覆盖索引优化**
```sql
-- ❌ 需要回表
SELECT * FROM users WHERE age > 20;

-- ✅ 推荐:使用覆盖索引
CREATE INDEX idx_age_name ON users(age, name);

-- 查询只需索引列,无需回表
SELECT age, name FROM users WHERE age > 20;
EXPLAIN SELECT age, name FROM users WHERE age > 20;
-- Extra: Using index
```

### **3. 索引选择性优化**
```sql
-- 低选择性列不适合单独建索引
SELECT COUNT(DISTINCT gender) / COUNT(*) FROM users; -- 选择性低
SELECT COUNT(DISTINCT email) / COUNT(*) FROM users; -- 选择性高

-- 创建前缀索引(长文本字段)
CREATE INDEX idx_email_prefix ON users(email(20));
```

## 🎯 **三、JOIN 优化**

### **1. JOIN 顺序优化**
```sql
-- ❌ 大表在前
SELECT * FROM large_table l
JOIN small_table s ON l.id = s.large_id;

-- ✅ 推荐:小表驱动大表
SELECT * FROM small_table s
JOIN large_table l ON s.large_id = l.id;
```

### **2. 避免多重子查询**
```sql
-- ❌ 多重子查询
SELECT u.name,
(SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) as order_count,
(SELECT SUM(amount) FROM orders o WHERE o.user_id = u.id) as total_amount
FROM users u;

-- ✅ 推荐:使用 JOIN + GROUP BY
SELECT u.name,
COUNT(o.id) as order_count,
SUM(o.amount) as total_amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
```

## 📈 **四、表结构优化**

### **1. 适当使用冗余字段**
```sql
-- 订单表增加用户名字段,避免频繁 JOIN
ALTER TABLE orders ADD COLUMN user_name VARCHAR(50);

-- 更新逻辑
UPDATE orders o
JOIN users u ON o.user_id = u.id
SET o.user_name = u.name
WHERE o.id = ?;
```

### **2. 垂直分表**
```sql
-- 原始表(包含不常用字段)
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100),
profile_text TEXT, -- 不常查询的大字段
settings JSON
);

-- 优化:拆分为两个表
CREATE TABLE user_basic (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);

CREATE TABLE user_detail (
user_id INT PRIMARY KEY,
profile_text TEXT,
settings JSON,
FOREIGN KEY (user_id) REFERENCES user_basic(id)
);
```

## 🔧 **五、查询执行优化**

### **1. 使用批量操作**
```sql
-- ❌ 多次单条插入
INSERT INTO logs (message) VALUES ('log1');
INSERT INTO logs (message) VALUES ('log2');

-- ✅ 推荐:批量插入
INSERT INTO logs (message) VALUES
('log1'), ('log2'), ('log3'), ('log4');

-- ❌ 循环更新
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock - 1 WHERE id = 2;

-- ✅ 推荐:批量更新
UPDATE products
SET stock = stock - 1
WHERE id IN (1, 2, 3);
```

### **2. 合理使用 UNION/UNION ALL**
```sql
-- ❌ UNION 会去重排序(性能开销)
SELECT id FROM active_users
UNION
SELECT id FROM inactive_users;

-- ✅ 推荐:UNION ALL 更快(如果不需要去重)
SELECT id FROM active_users
UNION ALL
SELECT id FROM inactive_users;
```

## 📋 **六、EXPLAIN 分析实战**

```sql
-- 1. 查看执行计划
EXPLAIN FORMAT=JSON
SELECT u.name, COUNT(o.id)
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.create_time > '2024-01-01'
GROUP BY u.id
HAVING COUNT(o.id) > 5
ORDER BY u.name;

-- 2. 分析关键指标
-- type: system > const > eq_ref > ref > range > index > ALL
-- Extra: Using filesort, Using temporary 需要关注
```

## 🎯 **七、优化 checklist**

1. **索引使用**
- WHERE/JOIN 条件是否有合适索引
- 是否使用覆盖索引
- 索引选择性是否足够高

2. **查询逻辑**
- 是否避免了 SELECT *
- 是否优化了子查询
- 分页查询是否优化

3. **表结构**
- 字段类型是否合适(避免过大)
- 是否需要垂直/水平分表
- 是否有合适的冗余字段

4. **执行计划**
- 是否出现全表扫描(type=ALL)
- 是否出现文件排序(Using filesort)
- 是否使用临时表(Using temporary)

## 💡 **优化建议流程**
```sql
-- 1. 找出慢查询
SHOW PROCESSLIST;
-- 或开启慢查询日志

-- 2. 使用 EXPLAIN 分析
EXPLAIN SELECT ...;

-- 3. 针对性优化
-- 添加索引、重写SQL、调整表结构

-- 4. 验证优化效果
-- 再次执行 EXPLAIN,对比优化前后
```

通过以上优化方式,通常可以显著提升查询性能。关键是:**分析执行计划,理解数据特点,针对性优化**。

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

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

相关文章

Qwen2.5 API调用实战:Python集成与响应解析指南

Qwen2.5 API调用实战&#xff1a;Python集成与响应解析指南 1. 引言 1.1 业务场景描述 在当前大模型应用快速发展的背景下&#xff0c;如何高效地将大型语言模型&#xff08;LLM&#xff09;集成到实际产品中成为关键挑战。本文聚焦于 Qwen2.5-7B-Instruct 模型的本地部署与…

忻州市忻府原平定襄五台英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025

在雅思培训市场鱼龙混杂的当下,忻州市忻府、原平、定襄、五台等地的考生普遍面临选课迷茫、优质机构难甄别、提分技巧匮乏、个性化方案缺失等痛点。如何在众多教育机构中选出靠谱且性价比高的品牌,直接关系到考试成败…

实战案例解析CANFD如何突破CAN的速率瓶颈

实战解析&#xff1a;CAN FD如何破解传统CAN的带宽困局你有没有遇到过这样的场景&#xff1f;在调试一辆智能电动车的BMS系统时&#xff0c;发现电池数据上传延迟严重&#xff1b;或者在做ADAS融合感知时&#xff0c;摄像头目标框频繁丢帧——而排查下来&#xff0c;并非算法或…

Qwen3-4B模型安全:内容过滤与敏感词处理

Qwen3-4B模型安全&#xff1a;内容过滤与敏感词处理 1. 引言 1.1 AI 写作大师 - Qwen3-4B-Instruct 随着大语言模型在内容生成、代码编写和逻辑推理等领域的广泛应用&#xff0c;如何确保其输出的安全性成为工程落地中的关键挑战。基于阿里云最新发布的 Qwen/Qwen3-4B-Instr…

IsoAlgo管道轴测图引擎用户界面

为了方便用户使用IsoAlgo,提供一个简单的用户界面IsoAlgo简介 IsoAlgo是图核科技公司自主研发的管道轴测图引擎piping Isometric drawing generation Algorithms的简称,读作ISO阿狗或爱狗。IsoAlgo可以通过读取IDF/P…

通义千问2.5推理延迟高?GPU利用率提升实战指南

通义千问2.5推理延迟高&#xff1f;GPU利用率提升实战指南 在大模型应用日益普及的今天&#xff0c;Qwen2.5-7B-Instruct 凭借其强大的指令理解与生成能力&#xff0c;成为众多开发者构建智能对话系统的首选。然而&#xff0c;在实际部署过程中&#xff0c;不少用户反馈&#…

2026年丽江口碑好的污水处理咨询,污水处理施工,污水处理设计厂家品牌推荐清单 - 品牌鉴赏师

污水处理厂家推荐榜 推荐一:云南龙帜环境工程有限公司品牌介绍:云南龙帜环境工程有限公司是国家高新技术企业,同时担任云南省环保协会副会长单位等。它长期专注环保水处理,业务涵盖生活、工业等多种废水处理,以及…

如何一键将照片转卡通?DCT-Net人像卡通化模型全解析

如何一键将照片转卡通&#xff1f;DCT-Net人像卡通化模型全解析 1. 技术背景与核心价值 随着虚拟形象、社交娱乐和数字内容创作的兴起&#xff0c;人像卡通化技术逐渐成为AI图像生成领域的重要应用方向。用户希望通过简单操作&#xff0c;将真实人脸照片自动转换为风格统一、…

Qwen-Image-2512未来展望:语言驱动修图新时代

Qwen-Image-2512未来展望&#xff1a;语言驱动修图新时代 随着多模态大模型的持续演进&#xff0c;图像编辑正从“像素操作”迈向“语义操控”的全新时代。阿里通义千问团队推出的 Qwen-Image-2512 模型&#xff0c;作为 Qwen-VL 系列在视觉生成领域的最新迭代&#xff0c;不仅…

2026全铝定制厂家实力TOP10:铝合金衣柜选品攻略,这几家闭眼入不踩雷 - 深度智识库

在 2026 年的家居消费市场,健康环保与耐用实用成为消费者选购家具的核心诉求。铝合金衣柜、全铝衣柜、金属衣柜等全铝定制产品,凭借零甲醛释放、防水防潮、使用寿命长等突出优势,迅速占领家装市场的半壁江山。为了帮…

vivado2025新手避坑指南:环境搭建中的十大错误

Vivado 2025 新手避坑指南&#xff1a;从零搭建稳定开发环境的实战经验 你是不是也曾在安装 Vivado 的第一天就卡在启动界面&#xff1f; 是不是下载了几个小时的安装包&#xff0c;结果双击 xsetup.exe 却弹出一串看不懂的日志错误&#xff1f; 又或者好不容易装上了&…

如何用PyTorch-2.x-Universal-Dev-v1.0快速实现图像超分辨率任务?

如何用PyTorch-2.x-Universal-Dev-v1.0快速实现图像超分辨率任务&#xff1f; 1. 引言 1.1 业务场景与技术背景 在计算机视觉领域&#xff0c;图像超分辨率&#xff08;Super-Resolution, SR&#xff09;是一项关键任务&#xff0c;旨在从低分辨率图像中恢复出高分辨率、细节…

HY-MT1.5-1.8B部署实战:边缘计算场景应用

HY-MT1.5-1.8B部署实战&#xff1a;边缘计算场景应用 1. 引言 随着全球化进程的加速&#xff0c;跨语言沟通需求在企业服务、跨境电商、内容本地化等场景中日益增长。传统云端机器翻译方案虽然性能强大&#xff0c;但在延迟敏感型边缘计算场景中面临网络依赖高、响应慢、数据…

通义千问3-14B部署教程:Windows下Ollama配置避坑指南

通义千问3-14B部署教程&#xff1a;Windows下Ollama配置避坑指南 1. 引言 1.1 学习目标 本文旨在为开发者提供一份完整的 Qwen3-14B 模型在 Windows 系统下的本地部署指南&#xff0c;重点围绕 Ollama Ollama WebUI 的组合使用展开。通过本教程&#xff0c;你将掌握&#x…

实测Cute_Animal_For_Kids_Qwen_Image:儿童绘本创作神器体验

实测Cute_Animal_For_Kids_Qwen_Image&#xff1a;儿童绘本创作神器体验 1. 引言&#xff1a;AI生成技术在儿童内容创作中的新突破 随着生成式AI技术的快速发展&#xff0c;图像生成模型已逐步从“写实风格”向“特定场景定制化”演进。尤其在儿童教育与绘本创作领域&#xf…

YOLOv12官版镜像部署避坑指南,新手必收藏

YOLOv12官版镜像部署避坑指南&#xff0c;新手必收藏 在深度学习目标检测领域&#xff0c;YOLO系列始终是开发者首选的高效框架。随着YOLOv12的发布&#xff0c;其以注意力机制为核心的全新架构打破了传统CNN主导的范式&#xff0c;在精度与效率之间实现了前所未有的平衡。然而…

Qwen2.5-7B边缘计算部署:Jetson设备适配实战案例

Qwen2.5-7B边缘计算部署&#xff1a;Jetson设备适配实战案例 1. 背景与挑战&#xff1a;大模型在边缘端的落地需求 随着生成式AI技术的快速发展&#xff0c;大型语言模型&#xff08;LLM&#xff09;已从云端逐步向边缘设备延伸。然而&#xff0c;受限于算力、内存和功耗&…

探讨资质齐全的旅游包车企业,安徽鸿展费用多少 - 工业品牌热点

问题1:旅游包车时,为什么要优先选择资质齐全的企业?安徽鸿展在资质方面有哪些优势? 旅游包车的核心需求是安全合规,而资质是保障这一需求的基础门槛。资质不全的企业可能存在超范围运营、车辆保险缺失、司机无从业…

MinerU 2.5-1.2B架构解析:多模态PDF解析技术揭秘

MinerU 2.5-1.2B架构解析&#xff1a;多模态PDF解析技术揭秘 1. 引言&#xff1a;复杂文档解析的技术挑战与突破 在当前AI驱动的内容处理场景中&#xff0c;PDF文档的自动化解析已成为知识提取、智能问答和大模型训练数据构建的关键环节。然而&#xff0c;传统OCR工具或文本提…

2026年云南知名的环保工程施工,环保工程,环保工程咨询厂家行业优质名录 - 品牌鉴赏师

引言在当今社会,环保意识日益深入人心,环保工程行业也迎来了快速发展的黄金时期。云南作为我国西南地区的重要省份,其环保工程市场在推动当地生态文明建设中扮演着关键角色。为了帮助广大客户在众多的环保工程厂家中…