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

MySQL慢查询优化实战教程:200万数据从3秒优化到50ms(EXPLAIN + 索引设计 + 延迟关联)

手把手带你用 EXPLAIN 索引优化 SQL 改写把一条 3 秒的慢查询干到50ms 以内。背景最近在做一个电商项目的订单列表查询页面加载巨慢。打开 Chrome DevTools 一看一个接口响应 3.2 秒。排查下来罪魁祸首是一条 SQL。这篇文章记录完整的排查和优化过程希望对你有帮助。第一步定位慢查询1.1 开启慢查询日志先确认 MySQL 慢查询日志是否开启SHOWVARIABLESLIKEslow_query%;SHOWVARIABLESLIKElong_query_time;如果没开临时开启SETGLOBALslow_query_logON;SETGLOBALlong_query_time1;-- 超过1秒就记录SETGLOBALslow_query_log_file/var/log/mysql/slow.log;生产环境建议写到my.cnf里持久化[mysqld] slow_query_log 1 long_query_time 1 slow_query_log_file /var/log/mysql/slow.log1.2 找到问题 SQL用mysqldumpslow快速分析慢查询日志mysqldumpslow-sat-t10/var/log/mysql/slow.log定位到这条 SQLSELECTo.id,o.order_no,o.total_amount,o.status,o.created_at,u.nickname,u.phoneFROMorders oLEFTJOINusers uONo.user_idu.idWHEREo.status2ANDo.created_atBETWEEN2026-01-01AND2026-03-01ORDERBYo.created_atDESCLIMIT20OFFSET0;看起来很普通但在 200 万订单数据量下跑了 3.2 秒。第二步用 EXPLAIN 分析执行计划EXPLAINSELECTo.id,o.order_no,o.total_amount,o.status,o.created_at,u.nickname,u.phoneFROMorders oLEFTJOINusers uONo.user_idu.idWHEREo.status2ANDo.created_atBETWEEN2026-01-01AND2026-03-01ORDERBYo.created_atDESCLIMIT20OFFSET0;结果idselect_typetabletypepossible_keyskeyrowsExtra1SIMPLEoALLNULLNULL2034567Using where; Using filesort1SIMPLEueq_refPRIMARYPRIMARY1NULL三个致命问题一眼看出来type ALL— 全表扫描200 万行一行行找key NULL— 没命中任何索引Using filesort— 排序走的磁盘临时文件不是索引排序第三步优化方案3.1 创建合适的联合索引分析 WHERE 和 ORDER BY 的字段WHERE status 2— 等值查询WHERE created_at BETWEEN ...— 范围查询ORDER BY created_at DESC— 排序联合索引的设计原则等值条件放前面范围/排序字段放后面。ALTERTABLEordersADDINDEXidx_status_created(status,created_at);为什么这样设计status是等值查询放第一位先大幅缩小数据范围created_at既是范围查询又是排序字段放第二位索引天然有序可以避免 filesort3.2 再次 EXPLAIN 验证加完索引后再跑一次 EXPLAINidselect_typetabletypepossible_keyskeyrowsExtra1SIMPLEorangeidx_status_createdidx_status_created8543Using index condition1SIMPLEueq_refPRIMARYPRIMARY1NULL变化很明显type: ALL → range— 从全表扫描变成索引范围扫描rows: 2034567 → 8543— 扫描行数降了 200 多倍filesort 消失了— 排序直接走索引此时查询耗时3.2s → 120ms。好了很多但还能更快。3.3 使用覆盖索引进一步优化当前 SQL 还需要回表查order_no、total_amount等字段。如果查询的字段都在索引里就不用回表了覆盖索引。但订单表字段太多全放索引不现实。换个思路——先查 ID再关联取数据SELECTo.id,o.order_no,o.total_amount,o.status,o.created_at,u.nickname,u.phoneFROMorders oINNERJOIN(SELECTidFROMordersWHEREstatus2ANDcreated_atBETWEEN2026-01-01AND2026-03-01ORDERBYcreated_atDESCLIMIT20OFFSET0)tONo.idt.idLEFTJOINusers uONo.user_idu.id;这就是经典的延迟关联Deferred Join技巧子查询只查id完全走覆盖索引不回表外层用id精确取 20 条数据最终耗时120ms → 45ms。效果对比指标优化前第一次优化最终效果扫描行数2,034,5678,54320是否 filesort是否否是否回表是全表是8543次是20次响应时间3,200ms120ms45ms踩坑记录坑 1联合索引字段顺序搞反了一开始建了INDEX(created_at, status)结果 EXPLAIN 显示还是全表扫描。原因created_at是范围查询放在前面会导致status无法利用索引。联合索引遵循最左前缀原则范围查询会“截断”后面的字段。正确的顺序是等值字段在前范围字段在后。坑 2OFFSET 过大导致深分页变慢当用户翻到第 1000 页时LIMIT 20 OFFSET 20000即使有索引也会很慢因为 MySQL 会扫描前 20000 条再丢掉。解决方案——游标分页用上一页最后一条的created_at和id做条件SELECTidFROMordersWHEREstatus2ANDcreated_at2026-02-15 13:20:00ANDid12345ORDERBYcreated_atDESC,idDESCLIMIT20;这样无论翻到第几页性能都是稳定的。坑 3时间字段用字符串比较-- 错误写法对索引列做了隐式类型转换索引失效WHEREDATE(created_at)2026-01-01-- 正确写法保持索引列原样WHEREcreated_at2026-01-01 00:00:00ANDcreated_at2026-01-02 00:00:00优化速查表遇到慢查询时按这个顺序排查步骤动作关注点1EXPLAIN看执行计划type 是否 ALLkey 是否 NULL2检查索引WHERE/ORDER BY 字段有没有合适的索引3检查索引顺序等值在前范围在后4检查是否回表能否用覆盖索引或延迟关联5检查分页方式OFFSET 大不大能否改游标分页6检查隐式转换索引列上有没有函数调用或类型转换总结这次优化的核心就三步加联合索引(status, created_at)— 等值在前范围在后延迟关联— 先查 ID 再取数据减少回表避免深分页— 用游标分页替代 OFFSET200 万数据量从 3.2 秒干到 45 毫秒70 倍提升。索引设计是后端的基本功但很多人只知道“加索引”不知道怎么加对。希望这篇文章能帮你建立系统的排查思路。关于作者后端开发工程师坐标北京专注高性能后端架构与数据库优化。欢迎交流有技术需求也可以私信我。

相关文章:

MySQL慢查询优化实战教程:200万数据从3秒优化到50ms(EXPLAIN + 索引设计 + 延迟关联)

手把手带你用 EXPLAIN 索引优化 SQL 改写,把一条 3 秒的慢查询干到50ms 以内。背景 最近在做一个电商项目的订单列表查询,页面加载巨慢。打开 Chrome DevTools 一看,一个接口响应 3.2 秒。排查下来,罪魁祸首是一条 SQL。这篇文章…...

龙虾虽好,预算要守!OpenClaw实力出众,合理控费更关键

没点进这篇文章的你,可能还未接触智能体;而点进来的你,大概率已经体验过“养龙虾”的便捷——这里说的,就是当下风靡全球的开源智能体OpenClaw。这只被网友亲切称为“赛博龙虾”的开源智能体,确实凭借突出的实用性收获…...

中国人民大学等顶尖高校联手破解大模型“懒惰“难题

这项由中国人民大学、澳门大学、中南大学、中国科学院大学、上海人工智能实验室、复旦大学、北京大学等多所顶尖院校联合开展的研究发表于2026年2月,论文编号为arXiv:2602.04935v2。有兴趣深入了解的读者可以通过这个编号查询完整论文。在人工智能助手日益普及的今天…...

鸿蒙真机调试

1、生成私钥和证书请求文件 打开DevEco Studio,点击【构建】->【生成私钥和证书请求文件】 以上步骤完成后,对应文件夹会出现三个文件: 2、证书文件 按步骤输入后会出现appid,如下图: 下一步需要添加设备&#xff…...

CSDN一亿技术人员的福音:专知智库OPC研究院发布“技术人一人公司赋能计划”

CSDN一亿技术人员的福音:专知智库OPC研究院发布“技术人一人公司赋能计划” CSDN有一亿技术人员。 这是一个惊人的数字。一亿个会写代码、懂逻辑、能解决问题的头脑,构成了中国数字经济的创造力底座。 但现实是,大多数技术人被困在这样一个…...

Openclaw玩转高德地图

🗺️ 通过本文可以满足类似如下需求 五一计划到昆明游玩,使用高德制作4天旅行攻略。同时将生成的旅行攻略发到钉钉群里,以满足行中探店、导航、打车、购票等出行需求。如下图所示: 用到了钉钉,Openclaw的对接可以参考前文https://blog.csdn.net/s060403072/article/deta…...

从金融OpenClaw热潮看企业架构如何落地“非侵入式”自动化

摘要 站在2026年3月13日这个时间节点回望,AI Agent(智能体)正经历着从“对话式玩具”向“生产力工具”的惊险一跳。近期,开源社区OpenClaw及其进阶版AlphaClaw在金融投研圈掀起的“龙虾热”,本质上是行业对自主执行AI的…...

Failed to create the npcap service: 0x8007007e

现象:安装wireshark报错“Failed to create the npcap service: 0x8007007e. Please try installing Npcap again, or use the latest official Npcap installer from https://npcap.com/” 原因: 未正确卸载而直接删除文件夹等原因所致 解决&#xff1…...

【多 Agent 协作系统】状态管理:共享记忆、分布式状态、一致性——构建可靠的多 Agent 状态系统!

【多 Agent 协作系统】状态管理:共享记忆、分布式状态、一致性——构建可靠的多 Agent 状态系统 状态管理是多 Agent 系统的核心挑战。本章将深入讲解共享记忆架构、分布式状态同步、一致性协议、状态持久化策略,以及状态管理的实战实现。 目录 前言:状态管理为什么重要 状态…...

ROS2 Topic 传输机制:板内 vs 跨板

ROS2 Topic 传输机制:板内 vs 跨板 1. 两种传输方式2. 传输决策逻辑场景传输方式是否反序列化同进程同节点Intra-Process (Zero-Copy)❌ 不需要同进程不同节点Intra-Process❌ 不需要不同进程DDS (UDP/TCP/Shared Memory)✅ 需要不同板块DDS (网络)✅ 需要3. Intra-…...

OpenClaw部署失败怎么办?云服务器常见问题汇总

很多开发者在部署OpenClaw时都会遇到各种问题,例如:安装失败、服务启动不了、端口无法访问等。OpenClaw部署失败到底该怎么解决?答案是:大部分部署问题其实都来自环境配置错误,例如Node.js版本不符合要求、服务器端口未…...

2026年丰县服务商TOP10榜单揭晓:谁才是口碑与效率双赢的行业标杆?

朋友们,最近丰县商家圈子里都在传一份榜单,说是2026年本地服务商TOP10。我特意去打听了一圈,发现这事儿挺有意思。有人说榜单是“虚名”,也有人说这是“风向标”。今天咱不吹不黑,就聊聊这份榜单背后,商家们…...

景区复购率低迷?全流程服务盘活留量|巨有科技

文旅行业复苏后,绝大多数景区都陷入了同一个运营怪圈:砸重金做营销、拓渠道抢新客,节假日客流爆满看似热闹,可游客离园之后,就彻底和景区断了联系,二次到访、多次复购的游客少之又少,老客留存率…...

电磁兼容性(EMC)设计与实践

现代工业自动化与智能制造领域,串口屏作为人机交互(HMI)的核心组件,其稳定性直接决定了设备的控制精度与用户体验。面对复杂的电磁环境,电磁兼容性(EMC)设计成为确保淘晶驰串口屏稳定运行的关键…...

通过fetch下载文件、音视频、图片

项目需要下载文件,后端接口返回的是文件的url地址,不是文件流 问题:直接通过a标签下载文件,若是接口返回音视频链接点击下载则是直接打开播放,不会下载 解决:使用 fetch 请求文件并将其下载到本地&#xff…...

谷歌浏览器更新后 localhost 127.0.0.1等本地服务器无法访问解决办法

今天2026-03-13谷歌更新版本后本地起前端服务谷歌浏览器所有本地服务均无法打开均报错为:ERR_CONNECTION_TIMED_OUT经过不段尝试 发现找到如下目录C:\Users\{xxxxxx}\AppData\Local\Google\Chrome\User Dataxxxx为win11用户名称 可自行替换找到根目录下Local State …...

基于SpringBoot+Vue的社区互助系统毕设项目(完整源码+论文+部署)

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css 开发工具:IDEA/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JDK版本&#…...

恳请大佬帮忙解惑!!!想用python写一个PDF图片转为excel表格的小工具

恳请大佬帮忙解惑,想用python写一个PDF图片转为excel表格的小工具,利用OCR来进行,但是效果不是很好,乱码比较多。恳求大佬帮忙!!!!...

扣子平台创建自己的插件

一、插件:里面有很多的工具 二、网页打开聚合数据(这是一个拥有很多工具的网站,可以通过API调用) 1、官网:https://www.juhe.cn/docs 2、注册、登录、认证 3、选择一个免费的工具,点击申请 4、申请完的工…...

硬盘二次开盘救回珍贵数据✨

临近春节假期,老客户的西数2T移动硬盘磁头坏了。由于我们公司春节提前放假了,客户着急忙慌的找其他小公司开盘恢复,直接判定盘片划伤无法恢复客户不甘心,等春节假期结束上班后找回我们,经检测硬盘其中有1张碟片严重划伤…...

基于Skynet增加RSA签名

一、背景 最近接入skynet做游戏的时候, 需要做一个自研 SDK 埋点对接,游戏服务器与 SDK 服务器通信需使用 RSA 签名规则: 游戏服务器调用 SDK:使用私钥签名(SHA1WithRSA) SDK 通知游戏服务器:使用公钥验签(SHA1WithRSA) 密钥编码:base64 所以写这个文档用于记录 二…...

【Java八股锁机制的认识】synchronized和reentrantlock区分,锁升级机制

synchronized和reentrantlock及其应用场景? synchronized 是什么 synchronized 是 Java 提供的 内置锁机制。 核心一句话:保证同一时间只有一个线程执行某段代码。例如 同时调用三个线程:线程A,线程B,线程C 有synchron…...

百考通AI文献综述:让研究起点更清晰

在学术研究的起步阶段,文献综述始终是奠定研究基础、厘清研究脉络的核心环节。它不仅需要广泛检索国内外文献,更要系统梳理研究进展、提炼核心观点、指出研究空白,对文献积累不足、时间精力有限的学子而言,常常陷入“文献难找、梳…...

题目2267:蓝桥杯2016年第七届真题-取球博弈

#include<iostream> #include<algorithm> using namespace std; int n[5], vis[1000][2][2];int dfs(int x, int f, int s) {if(vis[x][f%2][s%2] ! 2) {return vis[x][f%2][s%2];}if(x < n[1]) { // 不能取球了if((f%2 1) && (s%2 0)) return 1;els…...

混频器在雷达模块中的作用及原理……

混频器在雷达模块中的作用及原理…… 在超外差接收机里&#xff0c;正是混频器这个器件&#xff0c;把刚才聊的 RF&#xff08;射频&#xff09;和 IF&#xff08;中频&#xff09;联系在了一起。 如果说放大器是让信号变得更大&#xff0c;滤波器是让信号变得更纯&#xff0c;…...

百考通AI毕业论文智能生成,让学术创作高效又专业

又到毕业季&#xff0c;毕业论文成了无数学子的“心头大山”&#xff1a;选题迷茫、框架难搭、内容空洞、格式繁琐&#xff0c;从开题到定稿&#xff0c;每一步都充满挑战。熬夜赶稿、反复修改、焦虑失眠&#xff0c;成了很多毕业生的常态。百考通AI依托前沿人工智能技术&#…...

99个大模型在各个行业的应用的案例【2026最新】

精选99个标杆案例&#xff0c;划分为三大类别&#xff1a;45个"行业赋能"案例聚焦新型工业化、能源、医疗、政务等重点领域&#xff1b;46个"智能应用"案例覆盖天文、农业、化学等科学领域&#xff1b;8个"生态服务"案例包含智能数据标注、大模型…...

商务请客,没带“名牌酒”怎么开场?这3句话,比砸钱更显品位

在商务社交的江湖里&#xff0c;酒桌从来不是为了填饱肚子&#xff0c;而是一场关于尊重、资源与品位的无声博弈。过去&#xff0c;大家习惯了用“硬通货”来砸开信任的大门。但近两年&#xff0c;风向变了。随着商务环境回归理性&#xff0c;越来越多的“老江湖”发现&#xf…...

Hadoop 2.7.3 集群部署、配置与环境变量调优全流程总结

本次完成了基于 master/slave1/slave2 三节点的 Hadoop 分布式集群部署&#xff0c;核心涵盖集群基础配置、环境变量调优、问题排查与验证&#xff0c;最终实现集群全功能可用&#xff0c;以下是完整总结&#xff1a;一、核心部署与配置流程1. 基础环境准备&#xff08;前置步骤…...

SpringBoot如何调用节假日API

RestTemplate配置自行定义 工具类 Slf4j Component public class HolidayUtils {Resourceprivate RestTemplate restTemplate;private final static String KEY "http://tool.bitefu.net/jiari?d";public String getHoliday(long baselineDate) {DateTimeFormatter…...