慢SQL优化实战:我用这5招让查询速度提升100倍!(真实案例)

对SQL慢查询的优化(MySQL) 一、慢查询原因 要对慢查询进行优化,首先要搞清楚慢查询的原因,原因主要有三: (1)加载了不需要的数据列 (2)查询条件没有命中索引 (3)数据量太大 二、优化方案 优化也是针对这三个方向的: (1)先分析语句,看看是否加载了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,如果有这些问题,则对语句进行分析、重写 (2)分析语句的执行计划,获得其使用索引的情况,然后修改语句或修改索引,使得语句尽可能地命中索引 (3)如果对语句的优化都已经无法进行了,可以考虑 阅读详情
AI摘要

本文分享慢SQL优化实战经验。先介绍揪出慢查询的方法,如慢查询日志和EXPLAIN命令;分析常见5类慢查询及案例;给出索引优化、查询重构等5大优化必杀技;以电商系统为例展示优化过程;还提供避坑指南,最后总结出‘三步诊断法’。

一、先找痛点:如何揪出数据库中的"龟速"查询?

1.1 慢查询日志 - MySQL自带的"测速仪"(必装!!!)

-- 动态开启慢查询(立即生效)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 超过1秒的查询
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

更推荐在my.cnf永久配置:

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1  -- 抓出没走索引的查询(超级重要)

1.2 EXPLAIN命令 - 查询执行的"X光片"

拿到慢SQL后马上执行:

EXPLAIN SELECT * FROM orders WHERE user_id=123 AND status=1;

重点看这几个字段:

  • type列:出现ALL就是全表扫描(立即报警!)
  • rows列:扫描行数超过1万就要警惕
  • Extra列:看到Using filesort/Using temporary马上优化

二、最常见的5类慢查询(附真实案例)

2.1 全表扫描型

症状:EXPLAIN的type=ALL,rows数值爆炸
案例:用户表200万数据,查询:

SELECT * FROM users WHERE phone LIKE '%1314%';

优化方案:

  1. 添加逆向索引:ALTER TABLE users ADD INDEX idx_phone_reverse(reverse(phone))
  2. 改写查询:WHERE REVERSE(phone) LIKE REVERSE('%1314%')

2.2 索引失效型

五大作死写法(血泪教训):

  1. 对索引字段做运算:WHERE YEAR(create_time)=2023
  2. 使用前导通配符:WHERE content LIKE '%异常%'
  3. 隐式类型转换:WHERE order_no = 10086(order_no是varchar类型)
  4. OR连接非索引字段:WHERE a=1 OR b=2
  5. 不符合最左前缀:联合索引(a,b,c)但查询条件只有b和c

2.3 复杂查询型

最近优化的一个真实案例:

SELECT * FROM products 
WHERE id IN (
    SELECT product_id FROM orders 
    WHERE create_time > '2023-01-01'
    GROUP BY product_id 
    HAVING COUNT(*) > 100
)
ORDER BY price DESC 
LIMIT 100;

优化步骤:

  1. 用JOIN替代IN子查询
  2. 将HAVING条件转移到WHERE
  3. 添加复合索引(create_time, product_id)

2.4 锁等待型

某电商系统凌晨出现大量锁超时,排查发现:

UPDATE inventory SET stock=stock-1 
WHERE product_id=123 AND stock>0;

优化方案:

  1. 添加索引(product_id, stock)
  2. 使用乐观锁版本号控制
  3. 事务拆分为:先查询再更新,控制事务粒度

2.5 分页查询型

深度分页的典型问题:

SELECT * FROM logs 
ORDER BY id DESC 
LIMIT 1000000, 10; -- 需要扫描1000010行

优化方案:

  1. 使用游标分页:WHERE id < 上次最大ID
  2. 延迟关联:
SELECT * FROM logs 
INNER JOIN (
    SELECT id FROM logs 
    ORDER BY id DESC 
    LIMIT 1000000,10
) AS tmp USING(id);

三、我的优化工具箱(5大必杀技)

3.1 索引优化三板斧

  1. 覆盖索引:所有查询字段都在索引中
  2. 索引下推:5.6+版本默认开启,减少回表
  3. 联合索引排序:INDEX(a,b)同时优化WHERE a=1 ORDER BY b

3.2 查询重构技巧

  • 避免SELECT *:某次优化中,字段从23个减到3个,速度提升8倍
  • 用EXISTS代替IN:特别是子查询结果集大时
  • 拆分复杂查询:把一个大查询拆成多个小查询

3.3 分页优化秘籍

最近优化的一个案例:

-- 原始查询(执行2.3秒):
SELECT * FROM user_actions 
ORDER BY create_time DESC 
LIMIT 800000,20;

-- 优化后(0.02秒):
SELECT * FROM user_actions 
WHERE create_time < '2023-06-01' 
ORDER BY create_time DESC 
LIMIT 20;

3.4 锁优化策略

  • 尽量使用行锁:InnoDB默认
  • 控制事务粒度:短事务快进快出
  • 热点数据排队:用Redis做并发队列

3.5 定期维护

建立自动化任务:

-- 每周日凌晨3点执行
OPTIMIZE TABLE big_table;
ANALYZE TABLE important_table;

四、实战:某电商系统优化案例

4.1 场景还原

订单查询接口响应时间从200ms暴涨到5s+,QPS从200降到50

4.2 问题定位

  1. 慢日志发现大量类似查询:
SELECT * FROM orders 
WHERE user_id=123 
AND status IN(1,2,5) 
ORDER BY create_time DESC 
LIMIT 10;
  1. EXPLAIN显示:using filesort + using temporary

4.3 优化方案

  1. 新增联合索引:(user_id, status, create_time)
  2. 改写查询为:
SELECT * FROM orders FORCE INDEX(idx_user_status) 
WHERE user_id=123 
AND status=1
UNION ALL
SELECT * FROM orders FORCE INDEX(idx_user_status) 
WHERE user_id=123 
AND status=2
UNION ALL
SELECT * FROM orders FORCE INDEX(idx_user_status) 
WHERE user_id=123 
AND status=5
ORDER BY create_time DESC 
LIMIT 10;
  1. 接口响应时间降至80ms,QPS恢复到300+

五、避坑指南(血泪经验)

  1. 不要过早优化:先确保索引正确,再考虑其他
  2. 警惕"索引越多越好"的陷阱:曾见过一张表27个索引,写入速度像蜗牛
  3. 关注基数(Cardinality):性别字段建索引就是浪费
  4. 定期检查索引使用:SELECT * FROM sys.schema_unused_indexes
  5. 注意隐式排序:utf8mb4的排序规则可能导致意外排序

六、总结

经过多年的优化实战,我总结出慢SQL优化的"三步诊断法":

  1. 查(检查执行计划)
  2. 切(分析等待类型)
  3. 验(验证优化效果)

记住:优化是持续的过程,不是一劳永逸的!最近在优化一个分页查询时,通过延迟关联+覆盖索引的组合拳,把原本8秒的查询降到了0.2秒,这种成就感真的比中彩票还爽!

最后送大家一句话:数据库不会说谎,EXPLAIN说明一切。当你束手无策时,回到执行计划,总能找到突破口!

MySQL数据库的索引原理与慢SQL优化的5大原则 这篇文章主要介绍了MySQL数据库的索引原理与慢SQL优化的5大原则,包括:建立索引的原则,慢查询优化基本步骤,慢查询优化案例,explain使用,需要的朋友可以参考下我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。本文旨在以开发工程师的角度来解释数据库索引的原理和如何优化慢查询。 阅读详情

相关推荐

MySql学习之慢SQL优化和慢SQL案例

慢查询日志记录慢SQL explain查看分析SQL的执行计划 profile分析执行耗时 Optimizer Trace分析详情 确定慢SQL问题并采用相应的方案 隐式转换、最左匹配、深分页问题、in元素过多、order by 走文件排序、 索引字段上使用(!= 或者 < >)索引字段上使用is null, is not null,索引可能失效、 左右连接,关联的字段的编码格式不一样 、group by使用临时表、delete + in子查询不走索引、 其它索引失效场景,如like '%xxx'

zwb的博客 3282

如何针对慢查询的sql进行优化?

在优化 SQL 时,可以使用 EXPLAIN 命令来查看查询计划,找到 SQL 查询性能瓶颈,进而进行针对性优化。优化 JOIN 操作:在使用 JOIN 操作时,确保连接条件是正确的,并尽可能使用 INNER JOIN 而不是 OUTER JOIN,因为 INNER JOIN 的性能通常更好。减少返回数据量:尽可能只返回需要的数据,可以通过使用 SELECT 子句来指定需要的列,并使用 LIMIT 限制返回的行数。使用索引:确保表中的列都有适当的索引,尤其是在查询中频繁使用的列。

ggjklncffd的博客 4921

SQL语句优化五大黄金法则:让查询速度提升10倍

在数据库开发中,查询性能往往直接决定了系统的响应速度和用户体验。随着数据量的不断增加,如何提升 SQL 查询的执行效率成为了一个关键问题。无论是在大数据量环境下,还是在高并发的应用场景中,优化 SQL 查询都是至关重要的。本文将分享 SQL 优化的五大黄金法则,通过这些法则,你可以有效地提升查询性能,降低响应时间,甚至让查询速度提升10倍!无论你是数据库初学者,还是经验丰富的开发者,这些技巧都能帮助你在日常开发中提升数据库查询的效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 760

慢SQL优化的30个思路方案整理

对于一些特别大的表,单靠索引优化可能效果有限。这时,可以通过业务层面的优化来限制查询的时间范围,从而缩小查询范围,提高查询性能。以下是一些业务上可以采取的优化措施: 对大表进行时间范围分区(如按月、按季度),在查询时只针对相关时间段的分区进行查询,避免全表扫描。在业务层限制查询的时间窗口,如只允许查询最近一年的数据。对于超出时间窗口的查询,可以要求用户提供更具体的查询条件以缩小查询范围。 将历史数据定期归档到历史表或其他存储介质中,保持主表的数据量在一个合理范围内。查询时先在主表中查找,如果需要再到历史表中

发现问题,面对问题,分析问题,解决问题,总结问题 7367

SQLite子查询:3个技巧让你的查询速度提升10倍!

摘要:本文深入解析SQLite子查询的"三步成神"指南。首先介绍基础概念,包括内联子查询和子查询表达式的语法差异,以及非相关与相关子查询的性能特点。其次展示子查询在数据过滤、多表查询和聚合计算中的典型应用场景。重点探讨性能优化技巧,通过3个真实案例对比JOIN替代、索引创建等优化方法,实现查询速度10倍提升。最后提供实战建议,帮助开发者避免常见性能陷阱,高效使用SQLite子查询功能。(149字)

java专栏 1696

无监督低照度增强实战:用ZeroDCE和SCI拯救你的夜间照片(附PyTorch代码)

本文深入探讨了无监督低照度图像增强技术,重点解析了ZeroDCE和SCI两大代表性模型的核心原理与实战应用。通过对比分析两者的技术路径、网络结构及性能特点,并附上详细的PyTorch代码实现,旨在帮助读者掌握无需配对数据即可有效提升夜间照片画质的深度学习解决方案。

git9versioner的博客 489

3000字揭秘:SQL优化如何让查询速度提升10倍

在数字化转型的浪潮中,企业级数据库日均处理量突破千万级已成常态。然而据2025年《全球数据库性能白皮书》披露,高达89%的生产环境慢查询问题源于SQL语句低效,其中65%的案例可通过系统性调优实现5倍以上性能提升。本文基于真实电商系统调优案例,深度解析数据库工程与SQL调优的全链路解决方案,从索引策略到执行计划分析,从分区表设计到统计信息维护,构建可量化的性能提升体系。

Start_mswin的博客 790

Virtualbox “Kernel driver not installed (rc=-1908)”问题全面解析与修复指南

本文全面解析了Virtualbox出现'Kernel driver not installed (rc=-1908)'错误的原因及修复方法。详细介绍了如何通过重新安装virtualbox-dkms、处理Secure Boot特殊情况等步骤解决该问题,并提供了预防措施与最佳实践,帮助用户避免类似错误再次发生。

weixin_30352645的博客 528

SQL 查询优化实战:10 个技巧让慢查询速度提升 10 倍

以下技巧基于真实数据库优化经验,适用于 MySQL/PostgreSQL 等主流数据库,通过减少 I/O 操作、优化执行计划、降低计算复杂度提升性能。:所有优化必须基于真实环境测试,不同数据分布下效果可能差异显著。建议每次只修改一个变量,通过 A/B 测试对比效果。

grgredssd的博客 748

【gcc】跨版本兼容实战:高版本编译程序在低版本glibc环境下的部署方案

本文针对高版本gcc编译的程序在低版本glibc环境下部署的兼容性问题,提供了四种实战解决方案:静态编译的局限性、容器化部署的优雅方案、使用Devtoolset工具链的官方支持,以及最通用灵活的打包依赖SO发布方案。重点剖析了通过设置RPATH和Interpreter或使用patchelf工具,实现程序与自带库的独立部署,有效解决glibc版本鸿沟。

weixin_29237635的博客 358

从接线到组态:手把手教你搞定PROFIBUS-DP与PA的混合网络搭建(基于西门子TIA Portal)

本文详细介绍了PROFIBUS-DP与PA混合网络的搭建方法,基于西门子TIA Portal平台,从硬件选型、网络架构设计到组态配置和现场调试,提供了一套完整的实战指南。重点解析了DP/PA耦合器的使用、地址映射策略及网络诊断技巧,帮助工程师高效构建高可靠性的工业自动化网络。

weixin_32103009的博客 301

MySQL索引优化实战如何让你的查询速度提升10倍?

MySQL索引优化是一个从分析、实践到验证的持续过程。通过系统地使用慢查询分析和EXPLAIN命令,精准定位问题;通过掌握最左前缀、覆盖索引等核心策略,创建高效的索引;同时避免索引失效的陷阱并做好索引维护。将这些实战技巧应用于你的项目中,完全有可能让关键查询的速度提升10倍甚至更多,从而为应用程序带来极致的性能体验。

yinwen815的博客 1686

基于matlab的形态学的权重自适应图像去噪

数学形态学以图像的形态特征为研究对象,通过设计一套独特的数字图像处理方法和理论来描述图像的基本特征和结构,通过引入集合的概念来描述图像中元素与元素、部分与部分的关系运算。因此,数学形态学的运算由基础的集合运算(并、交、补等)来定义,并且所有的图像矩阵都能被方便地转换为集合。随着集合理论研究的不断深入和实际应用的拓展,图像形态学处理也在图像分析、模式识别等领域起着重要的应用。实验结果表明,如果仅通过串联滤波器去噪,则往往具有一定的局限性,在结果图像中也保留着较为明显的噪声。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 756

慢SQL优化实战:5个真实案例带你原地起飞(附血泪踩坑史)

索引不是万金油:维护过期的索引反而会降低写性能(亲身经历索引过多导致写入慢2倍😭)EXPLAIN要看全:有次只看type没注意filesort,结果在500万数据表翻车(被DBA追着打😅)字段类型要规范:曾经把IP存成varchar,后来改成INT用INET_ATON()函数,查询快10倍(真·教科书级优化)定期review慢日志:设置每周一检查慢查询的日历提醒(救过三次线上事故💣)ORM框架要慎用:见过N+1查询搞崩系统的案例(特别是Hibernate的延迟加载陷阱😱)

byteflow8的博客 1164

用 SAP ABAP ALV 重塑 SM30:可扩展的自定义表维护视图与自动传输实践

文章摘要: 本文提出了一种基于ALV Grid的动态表维护框架,用于替代传统SM30维护视图。该方案通过输入表名自动生成维护界面,支持动态筛选、批量操作和自动传输管理。核心设计包括:利用BAdI实现扩展点、通过行状态字段简化数据变更跟踪、使用Style Table控制单元格编辑权限、集成CTS实现自动传输。相比SM30标准维护,该框架显著提升了交互体验(支持ALV排序/过滤/汇总)和业务扩展性(统一校验与权限控制),同时解决了"维护+传输"流程割裂的问题。文中详细阐述了技术实现方案,并提

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 318

手把手教你学Simulink--电机电磁兼容与可靠性​场景示例:基于Simulink的电机轴电压与轴电流抑制仿真

本文带你完成了电机轴电压与轴电流抑制的Simulink仿真,实现了:✅ 揭示了共模电压 → 寄生电容 → 轴电压 → 轴承电蚀的完整链路✅ 搭建了含寄生参数的高频电机等效模型共模电压最小化PWM(源头抑制)dv/dt滤波器(路径阻断)轴接地(终端泄放) ✅ 通过仿真验证了轴电压从68 V降至<3 V的显著效果 ✅ 为高可靠性电机系统提供低成本、高效益的轴承保护方案。

MHD0815的博客 315

如何做mysql调优?绝命7招,让慢SQL调优100倍

一亿用户量,平均每人每天10次的业务量,要求并发数在5000以上,峰值在5w到10w之间,QPS在25w以上, 如何进行压测?如何进行调优?对于架构师、高级开发来说, 调优是 核心内容, 那么压测更是内功中的内功。尼恩团队结合资深架构经验和行业案例,给大家梳理一个系列的《Java 调优圣经》PDF

架构师尼恩 2117

11年电赛综合测评——单运放三角波发生器

目录 背景知识科普: 原理:局部负反馈+大环负反馈+积分器 仿真图如下: 背景知识科普: 反馈电路是将放大器输出信号(电压或电流)的一部分或全部,回收到放大器输入端与输入信号进行比较(相加或相减),并用比较所得的有效输入信号去控制输出,这就是放大器的反馈过程。 一、反馈放大器反馈极性的经验分析法—符号法 分析步骤1.在输入端上加上一个“+”或“-”的输入信号,按瞬时极性法标出反馈放大器中各个电极(基极b,集电极c,发射极e)电压的瞬时性。 2.判断经放大和反馈后得到的反馈信号Xf的瞬时极性

沉迷单车的追风少年 9905

sql查询速度太慢怎么优化

今天群里的小伙伴问的问题 在这里分析一下sql查询速度太慢怎么优化 原因分析 后台数据库中数据过多,未做数据优化 数据请求-解析-展示处理不当 网络问题 提高数据库查询的速度方案 SQL 查询速度慢的原因有很多,常见的有以下几种: 1、没有索引或者没有用到索引(查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7、锁或者死锁(这也是查询慢最常..

youngpeople_的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SQLite索引优化的5个黄金法则:提升查询速度10倍的真实案例

掌握SQLite索引优化技巧,显著提升查询性能。通过Python实战演示5大黄金法则,涵盖索引设计、覆盖索引与查询重写,适用于高频查询场景,实现速度提升10倍。SQLite Python实战精华总结,值得收藏。

CodePulse的博客 972

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SQL优化秘籍:让查询速度提升百倍的实战指南

在互联网行业高速发展的今天,数据库性能直接决定着用户体验与企业效益。某头部电商平台曾因商品搜索延迟导致用户流失率激增20%,通过精准的SQL优化策略,查询响应时间从4.5秒压缩至0.3秒,单日GMV提升35%。本文将深度揭秘SQL优化核心方法论,助你掌握让数据库性能飙升的实战密码。

Start_mswin的博客 1263

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《 慢 SQL 分析与 SQL 优化实战指南》

《慢 SQL 分析与优化实战指南》摘要:慢 SQL 是数据库性能主要瓶颈,可能导致锁等待、雪崩效应等问题。通过慢日志分析(mysqldumpslow/pt-query-digest)定位问题后,重点检查索引失效(占比45%)、全表扫描、深分页等情况。优化核心是执行计划解读(type需≥range)和联合索引最左匹配原则,典型案例可使查询提速46倍。建立预防体系包括开发规范(禁用SELECT*)、SQL审核和持续监控。优化优先级为:索引优化(解决80%问题)→SQL改写→表结构调整→架构升级。黄金法则是最小扫

qq_43414012的博客 974

11148收藏分享绝命10招,让慢SQL调优100倍,通过电商案例手把手带你SQL调优

本文将通过实际案例,探讨MySQL调优的关键步骤和技巧,帮助大家了解如何识别和解决常见的性能问题,从而优化数据库系统的性能表现。在接下来的内容中,我们通过相关案例来深入探讨监测和诊断、查询优化、数据库配置调优、硬件和操作系统优化等方面的具体技术和实践,以帮助读者全面理解MySQL调优的实战过程,并最终提升其应用程序的性能和稳定性。

qq_66627105的博客 981

揭秘慢查询根源:如何通过索引优化让SQL执行速度提升100倍

解决慢查询难题,掌握数据库性能优化:索引与查询语句的关键策略。通过合理创建索引、优化SQL执行计划,提升查询效率达百倍,适用于高并发、大数据量场景。显著降低响应时间,增强系统稳定性,值得收藏。

AlgoPerch的博客 646
上一篇: 慢SQL优化实战:我用这5招让查询速度提升100倍!(真实案例)
下一篇: 这年头还不会用JWT做登录验证?手把手教你搞定用户认证(附避坑指南)
普通网友
博客等级 码龄2年 117粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值