当前位置: 首页 > news >正文

SQL优化实战:如何让查询速度提升10倍

前言

数据分析师工作中,SQL是最核心的技能之一。但很多人的SQL写得很慢,查询跑了10分钟还不出结果,严重影响工作效率。

本文结合实际案例,分享SQL优化的核心思路,帮助你把查询速度从10分钟优化到1分钟以内。

一、为什么SQL会慢

SQL查询慢的本质原因只有一个:扫描了太多数据。理解这一点,所有的优化手段都能推导出来。

常见的慢查询原因:

  • SELECT * 全表扫描
  • WHERE条件没有索引
  • JOIN没有正确的连接条件
  • GROUP BY/DISTINCT 数据量太大
  • 子查询嵌套层数过多

二、案例分析:订单报表优化

2.1 原始查询(耗时8分钟)

SELECT o.order_id, o.user_id, o.order_time, o.amount, u.username, u.city, p.product_name, p.category FROM orders o LEFT JOIN users u ON o.user_id = u.user_id LEFT JOIN order_items oi ON o.order_id = oi.order_id LEFT JOIN products p ON oi.product_id = p.product_id WHERE o.order_time >= '2025-01-01' AND o.order_time < '2026-01-01' AND u.city IN ('北京', '上海', '广州', '深圳') ORDER BY o.order_time DESC;

2.2 优化思路

第一步:添加合适的索引

-- 为 WHERE 条件字段添加索引 CREATE INDEX idx_orders_time ON orders(order_time); CREATE INDEX idx_orders_user ON orders(user_id); CREATE INDEX idx_users_city ON users(city); -- 为 JOIN 字段添加索引 CREATE INDEX idx_order_items_order ON order_items(order_id); CREATE INDEX idx_products_id ON products(product_id);

第二步:减少扫描范围

-- 先筛选再JOIN,减少中间数据量 SELECT o.order_id, o.user_id, o.order_time, o.amount, u.username, u.city, p.product_name, p.category FROM ( -- 先筛选主表 SELECT order_id, user_id, order_time, amount FROM orders WHERE order_time >= '2025-01-01' AND order_time < '2026-01-01' ) o LEFT JOIN ( -- 再筛选用户表 SELECT user_id, username, city FROM users WHERE city IN ('北京', '上海', '广州', '深圳') ) u ON o.user_id = u.user_id LEFT JOIN order_items oi ON o.order_id = oi.order_id LEFT JOIN products p ON oi.product_id = p.product_id ORDER BY o.order_time DESC;

第三步:用EXISTS替代IN(适用于子查询)

-- 优化前(IN子查询) SELECT * FROM orders WHERE user_id IN ( SELECT user_id FROM users WHERE city = '北京' ); -- 优化后(EXISTS) SELECT * FROM orders o WHERE EXISTS ( SELECT 1 FROM users u WHERE u.city = '北京' AND u.user_id = o.user_id );

2.3 优化结果

优化阶段耗时说明
原始查询8分钟全表扫描
添加索引3分钟索引生效
减少扫描45秒先筛再JOIN
最终优化12秒综合优化

提升倍数:40倍

三、常用优化技巧总结

3.1 索引优化

-- 组合索引遵循最左前缀原则 -- 创建组合索引 CREATE INDEX idx_col1_col2 ON table_name(col1, col2); -- 查询能命中索引的情况 WHERE col1 = 'xxx' -- ✅ 命中 WHERE col1 = 'xxx' AND col2 = 'yyy' -- ✅ 命中 WHERE col2 = 'yyy' -- ❌ 不命中 -- 避免在索引列上使用函数 WHERE YEAR(create_time) = 2025 -- ❌ 不命中索引 WHERE create_time >= '2025-01-01' -- ✅ 命中索引

3.2 LIMIT分页优化

-- 优化前(深分页慢) SELECT * FROM orders ORDER BY order_id LIMIT 1000000, 20; -- 优化后(基于ID分页) SELECT * FROM orders WHERE order_id > 1000000 ORDER BY order_id LIMIT 20;

3.3 COUNT优化

-- 优化前(COUNT * 全表扫描) SELECT COUNT(*) FROM orders WHERE status = 1; -- 优化后(使用索引计数) SELECT COUNT(1) FROM orders WHERE status = 1; -- 或者维护统计表(实时性要求不高时)

四、如何判断SQL性能

使用 EXPLAIN 分析执行计划:

EXPLAIN SELECT * FROM orders WHERE order_time >= '2025-01-01'; -- 关键字段说明: -- type: 连接类型(const > eq_ref > ref > range > ALL) -- key: 实际使用的索引 -- rows: 预计扫描行数 -- Extra: 额外信息(Using index, Using filesort等)

五、总结

SQL优化的核心原则:

  • 减少数据扫描量:WHERE条件尽量精确
  • 合理使用索引:为高频查询字段建索引
  • 避免全表扫描:不用SELECT *,少用函数
  • 优化JOIN顺序:小表驱动大表
  • 分析执行计划:用EXPLAIN定位问题

记住:SQL优化是一个持续的过程,没有银弹,只有不断分析和迭代。


作者简介:船长,数据分析师,关注数据分析、职场成长、投资理财。

http://www.jsqmd.com/news/674968/

相关文章:

  • 2026年3月自动贴标机生产厂家推荐,全自动贴标机/高精度贴标机/自动贴标机/桌面贴标机,自动贴标机生产厂家哪个好 - 品牌推荐师
  • 2019 年,C# 还值得学习吗?
  • 移动端架构设计
  • NLP-StructBERT与数据库联动:实现海量文本的毫秒级语义检索
  • leetcode 88.合并两个有序数组
  • 2026年知名的扬州一站式装修公司/扬州半包装修公司/扬州大平层装修公司/扬州装修公司TOP5推荐 - 行业平台推荐
  • Z-Image权重测试台部署教程:WSL2环境下NVIDIA Container Toolkit配置
  • 别再手动分配管脚了!Quartus Prime 23.1 中一键解决管脚冲突与三态设置的保姆级教程
  • Qwen3-Reranker参数详解:max_length、batch_size与显存占用关系
  • 软件进度控制中的关键路径跟踪
  • 从float64到float16:一次NumPy数组内存优化的完整实战记录(附性能对比)
  • VBA-JSON终极指南:让Office应用轻松处理JSON数据的完整解决方案
  • Linux内核SCSI错误处理实战:当你的硬盘IO卡住或报错时,内核到底做了什么?
  • 「EEG脑电信号处理——(22)脑机接口常用生理信号频率与幅值特性分析」2026年04月20日
  • 智能梯控系统的各项配置相互协作,共同实现了电梯的智能管理和安全控制。通过合理的配置和应用,可以满足不同场景下的电梯使用需求,提高电梯的运行效率和安全性,为用户提供更加便捷、舒适的乘梯体验。
  • 2026年知名的0D超透丝袜/防晒凉感丝袜生产厂家推荐 - 品牌宣传支持者
  • GBase 8a之聚合函数: 计算峰度功能的实现
  • 2026年热门的无锡企业消杀/无锡消杀除马蜂/无锡消杀服务售后无忧公司 - 品牌宣传支持者
  • CogVideoX-2b故障恢复:任务中断后断点续生的可行性研究
  • 智能风控化技术异常检测算法与风险评估模型
  • 保姆级教程:人脸分析系统API调用全解析,小白也能玩转自动化
  • Qwen3.5-9B-GGUF部署案例:制造业设备说明书智能问答系统
  • 基于PyQt5与Docker的单片机智能远程控制与状态监测上位机系统设计与实现
  • 如何在 Vite + React 项目中禁用自动热更新(HMR)
  • Python中如何进行NumPy多项式拟合_使用polyfit实现回归
  • 2026年口碑好的无锡HACCP虫控服务/无锡酒店消杀/无锡消杀服务高评分公司推荐 - 行业平台推荐
  • 5分钟快速上手:QMCDecode音频格式转换完整指南
  • 推荐系统实时性
  • 2026年口碑好的电动四轮消防车/四轮消防车/小型消防车优质厂家汇总推荐 - 品牌宣传支持者
  • 【限时解密】Loom响应式项目CI/CD流水线重构方案(GitHub Actions + JUnit 5.12+ Loom-aware Profiling插件)