MySQL慢查询优化实战指南:从8秒到0.3秒的蜕变之路

MySQL 如何优化慢查询? 在日常开发中,我们往往会给表加各种索引,来提高 MySQL 的检索效率。 但我们有时会遇到明明给字段加了索引,并没有走索引的Case。 进而导致 MySQL 产生慢查询。 严重场景下,甚至出现主从延迟、数据库拖垮的极端事故。本文梳理出索引失效的几种常见场景给大家参考。只要我们在 前加上 ,就可以分析出,当前环境下 的“查询方式”以及“索引选择”。首先大致看下每个字段的含义:下面按性能从高到低的顺序介绍type类型: 以下四种类型,说明 “性能很好,一般无需优化” :以下几种类型,需要 “看具体情况,决定 阅读详情

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一、揪出元凶:定位慢查询的三种姿势

1. 慢查询日志(必杀技)

在my.cnf配置中加入这三行(超级重要):

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1  # 超过1秒的都记下来(建议生产环境设2秒)

重启MySQL后,慢查询就像被装了GPS的逃犯,所有执行超过1秒的SQL都会在日志里现形!

2. 进程列表快照(急诊室诊断)

突发卡顿时,速查当前运行语句:

SHOW FULL PROCESSLIST;  -- 重点看Time列和State列

看到Sending data状态超过3秒的?立马标记为嫌疑犯!

3. 性能模式(高阶装备)

MySQL 5.7+用户试试这个监控方案:

UPDATE setup_consumers SET ENABLED = 'YES' 
WHERE NAME LIKE '%statement%';

所有SQL执行细节自动归档到events_statements_summary_by_digest表,比X光还清晰!

二、深度解剖:EXPLAIN执行计划六脉神剑

拿到慢SQL后,先祭出EXPLAIN大法:

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

关键指标解读(划重点!!):

  1. type列:ALL全表扫描(立即报警!),index走索引,range范围扫描
  2. rows列:预估扫描行数,超过1000就要警惕
  3. Extra列:出现Using filesort或Using temporary说明在犯罪现场!

举个真实案例(血泪教训):

-- 优化前
EXPLAIN SELECT * FROM users WHERE DATE(create_time) = '2023-01-01';

-- 优化后
EXPLAIN SELECT * FROM users 
WHERE create_time BETWEEN '2023-01-01 00:00:00' AND '2023-01-01 23:59:59';

就改了个时间范围查询,type从ALL变成range,查询速度直接提升10倍!

三、索引优化九阴真经(实战精华)

1. 联合索引避坑指南

错误示范:

ALTER TABLE orders ADD INDEX idx_status (status);

status字段只有3个枚举值,建单列索引≈白建!

正确姿势:

ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);

联合索引选择性直接飙升到90%!

2. 隐式转换陷阱

这条SQL会让你死得很惨:

SELECT * FROM users WHERE phone = 13800138000; 
-- phone是varchar类型!!

MySQL会默默做全表扫描,改成phone='13800138000'速度立马上天!

3. 索引失效的七宗罪

  • ❌ 对索引字段使用函数:WHERE LEFT(name,3)='张'
  • ❌ 类型不匹配:WHERE id='100'(id是int类型)
  • ❌ 模糊查询乱用:WHERE content LIKE '%优化%'
  • ❌ 索引列参与运算:WHERE YEAR(create_time)=2023

四、慢查询终极优化五式

招式1:化整为零

-- 原语句(耗时5秒)
DELETE FROM logs WHERE create_time < '2022-01-01';

-- 优化版(每次删1000条)
WHILE EXISTS(SELECT 1 FROM logs WHERE create_time < '2022-01-01' LIMIT 1) DO
  DELETE FROM logs WHERE create_time < '2022-01-01' LIMIT 1000;
  COMMIT;
  SLEEP 1;
END WHILE;

招式2:空间换时间

给统计报表加个缓存表:

CREATE TABLE daily_report (
    date DATE PRIMARY KEY,
    order_count INT,
    total_amount DECIMAL(10,2)
) ENGINE=InnoDB;

-- 每天凌晨更新
REPLACE INTO daily_report 
SELECT DATE(create_time), COUNT(*), SUM(amount) 
FROM orders 
WHERE create_time >= CURDATE() - INTERVAL 1 DAY
GROUP BY DATE(create_time);

招式3:拆解复杂查询

原语句:

SELECT u.*, o.order_count 
FROM users u
LEFT JOIN (
    SELECT user_id, COUNT(*) AS order_count 
    FROM orders 
    GROUP BY user_id
) o ON u.id = o.user_id
WHERE u.create_time > '2023-01-01';

优化版:

-- 先查用户ID
CREATE TEMPORARY TABLE tmp_users 
SELECT id FROM users WHERE create_time > '2023-01-01';

-- 再查订单数
CREATE TEMPORARY TABLE tmp_orders 
SELECT user_id, COUNT(*) AS order_count 
FROM orders 
WHERE user_id IN (SELECT id FROM tmp_users)
GROUP BY user_id;

-- 最后联查
SELECT u.*, o.order_count 
FROM tmp_users tu
JOIN users u ON tu.id = u.id
LEFT JOIN tmp_orders o ON tu.id = o.user_id;

五、真实案例:电商系统8秒查询优化记

问题场景:
商品搜索页SQL耗时8秒:

SELECT * FROM products 
WHERE category_id=5 
AND price BETWEEN 100 AND 1000 
AND status=1 
ORDER BY sales DESC 
LIMIT 100 OFFSET 0;

优化过程:

  1. 原执行计划显示type=ALL,扫描20万行
  2. 创建联合索引:
ALTER TABLE products ADD INDEX idx_search (category_id, status, price, sales);
  1. 改写分页语句:
SELECT * FROM products 
WHERE category_id=5 
AND status=1 
AND price >= 100 
AND price <= 1000 
AND sales <= (SELECT sales FROM products 
              WHERE category_id=5 
              AND status=1 
              ORDER BY sales DESC 
              LIMIT 100,1)
ORDER BY sales DESC 
LIMIT 100;

最终效果:查询时间从8秒降到0.3秒!

六、性能监控三板斧(日常必备)

  1. 每周慢查询分析:
mysqldumpslow -s t /var/log/mysql/slow.log | head -20
  1. 实时监控利器:
watch -n 1 "mysqladmin -uroot -p processlist | grep -v Sleep"
  1. 性能趋势图:
SELECT DIGEST_TEXT, COUNT_STAR, 
       AVG_TIMER_WAIT/1000000000 AS avg_time 
FROM performance_schema.events_statements_summary_by_digest 
ORDER BY avg_time DESC 
LIMIT 10;

写在最后

慢查询优化就像侦探破案,需要:

  1. 找到真凶(定位慢SQL)
  2. 分析作案手法(EXPLAIN解读)
  3. 制定抓捕方案(索引+SQL改写)
  4. 完善安防体系(监控预防)

记住这个性能优化口诀(建议截图保存):
“索引要走覆盖,范围查询要警惕;
排序分组临时表,能免则免效率高;
批量操作分页查,化整为零最可靠!”

MySQL性能优化全攻略:从慢查询到高效数据库的蜕变 《MySQL性能优化全攻略》摘要:文章系统讲解MySQL性能优化方法,包括慢查询日志分析、EXPLAIN执行计划解读、索引设计与优化原则(复合索引、最左前缀)、SQL查询优化技巧(避免SELECT*、JOIN优化、分页改进)、数据库schema设计(规范化与反规范化平衡、数据类型选择)以及关键配置参数调优。作者王文峰(优快云博客之星)从实战角度,提供代码示例和优化建议,帮助开发者提升MySQL性能。(149字) 阅读详情

相关推荐

MySQL慢查询优化:从2秒到2毫秒的蜕变

在数据库优化领域,慢查询是一个常见的问题,它不仅影响系统的响应速度,还可能导致用户体验下降。在平时系统开发中,产品也会要求系统查询必须在几秒响应之内,作为后端开发人员具备系统优化能力是十分重要的,本文将以个人工作实际项目分析入手,详细介绍如何通过优化SQL查询和增加索引,将一个原本耗时2秒的查询优化到仅需2毫秒,欢迎大家在评论区一起讨论。本文通过一个具体的案例,详细介绍了慢查询优化的过程和方法,手把手讲解如何分析慢SQL,最终通过增加适当的索引,可以显著提高SQL查询的执行效率,实现从2秒到2毫秒的蜕变。

qi_ming88的博客 105

慢查询如何优化?(实战慢查询)

windows中是 my.ini 文件 linux和MacOs中是 my.cnf 文件 开启慢查询日志 5.5以上版本 直接分析慢查询日志, mysql使用 + sql语句进行模拟优化器来执行分析。 oracle使用 + sql语句进行模拟优化器来执行分析。table | type | possible_keys | key |key_len | ref | rows | Extra EXPLAIN列的解释: table 显示这一行的数据是关于哪张表的 type

jj89929665的博客 8665

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7709

什么是慢查询?如何优化?

什么是慢查询?如何优化? 可以通过索引优化和拆解分批的方式来优化SQL以减少慢查询。

itigoitie的博客 1万+

STM32——IIC(I2C)中断与DMA通信实战解析

本文深入解析STM32的IIC(I2C)通信中断与DMA实战应用。通过对比轮询方式的低效,详细介绍中断模式和DMA模式的实现原理、状态机编程技巧及性能优化策略,并结合SHT30传感器案例展示如何高效读取数据,显著提升系统响应速度和CPU利用率。

week9的博客 807

XGBoost特征重要性为0的问题:深度解析与应对策略

在机器学习领域,XGBoost(Extreme Gradient Boosting)作为一款高效且强大的集成学习算法,已经被广泛应用于各类预测任务中。然而,在实际应用过程中,许多数据科学家和工程师们遇到了一个令人困惑的现象——某些特征的重要性值为0。这不仅影响了模型的解释性,还可能导致特征选择过程中的误判。本文将深入探讨这一问题,分析其背后的原因,并提供相应的解决方案。在深入探讨特征重要性为0的问题之前,我们首先需要了解XGBoost是如何计算特征重要性的。XGBoost提供了三种常见的特征重要性计算方法:

cda2024的博客 1705

MySQL性能优化:慢查询优化

这一点,也是针对联合索引来说的,前面我们反复强调过,所有记录都是按照索引列的值从小到大的顺序排好序的,而联合索引则是按创建索引时的顺序进行分组排序。由于B+树中的数据页和记录是先按insert_time列排序的,所以我们上边的查询过程其实是这样的:找到insert_time值为'2021-03-22 18:23:42' 的记录。找到insert_timee值为'2021-03-22 18:35:00'的记录。

weixin_55229531的博客 5万+

伺服电机三环控制实战:从参数整定到系统优化

本文以实战视角,深入解析伺服电机三环控制(位置环、速度环、电流环)的参数整定与系统优化全流程。文章摒弃复杂理论,通过生动的比喻和分步调试指南,详细阐述了从电流环快速响应、速度环平滑调节到位置环精准定位的调试方法,并提供了常见问题排查与进阶优化技巧,帮助工程师有效提升伺服系统性能与稳定性。

weixin_29201933的博客 244

mysql慢查询优化

定位低效 SQL 执行慢有两种情况: 偶尔慢:DB 在刷新脏页 redo log 写满了 内存不够用,要从 LRU 链表中淘汰 MySQL 认为系统空闲的时候 MySQL 关闭时 一直慢的原因:索引没有设计好、SQL 语句没写好、MySQL 选错了索引 ’mysql慢查询优化 第一步:开启mysql慢查询日志,通过慢查询日志定位到执行较慢的SQL语句。 第二步:利用explain关键字可以模拟优化器执行SQL查询语句,来分析SQL查询语句。 第三步:通过查询的结果进行优化。 优化方式 (1)首先分

weixin_45615504的博客 7662

【DRAM存储器二十六】DDR4介绍-DDR4 SDRAM的主要技术特性之CA Parity、CRC Write date

详述DDR4的CA奇偶检验和写数据CRC校验功能

highman110的博客 1297

PyTorch实战(4)——卷积神经网络(Convolutional Neural Network,CNN)

卷积神经网络 (Convolutional Neural Network, CNN) 是一种广泛应用的深度学习模型。通过参数共享、局部感知和空间结构等优势,能够更好地处理图像数据,并在图像识别、目标检测和图像生成等任务中展现出强大的能力。在本节中,介绍了卷积的计算方法以及卷积神经网络的基本组件,并使用 PyTorch 构建了卷积神经网络以深入了解其工作原理。

盼小辉丶的博客 1万+

MySQL慢查询优化实战:从蜗牛速度到闪电响应的蜕变之路(建议收藏)

🔹索引使用三原则建合适的,避无效的,定期维护的🔹SQL编写四不要不要SELECT *,不要嵌套过深,不要隐式转换,不要全表扫描🔹架构设计两板斧读写分离解压力,缓存策略保平安最后说句掏心窝的话:优化永无止境,但掌握正确方法可以少走80%的弯路!

datadigital的博客 1657

【智能车Code review】——环岛的判定与补线操作

【1】效果展示图 状态1、状态2 状态3 状态4、状态5 状态6 状态7 状态8 【2】状态机设定需要的参数 以右环岛为例: k_left:左线的斜率 rou_of_left:左线的方差 last_rou_of_left:上一帧的左线方差 l_start:左线第一行为黑的所在行 right_turn_down; right_turn_middle; right_turn_up; 左线的下、中、上拐点 fiv_width[i]:第i行的赛道宽度 leftline_du

hanhan的博客 2万+

MySQL慢查询优化实战:从20秒到0.2秒的蜕变之路

上周三凌晨2点(别问我为什么这个时间还在加班),我们的电商平台突然收到大量用户投诉:“购物车加载不出来!” 我盯着监控大屏上持续飙红的数据库CPU曲线(已经冲到95%了!),手抖着打开了慢查询日志…(真实案例警告)这个原本运行良好的订单查询接口,在促销期间响应时间从200ms暴涨到。最近在优化一个统计报表时,发现个反直觉的现象:明明加了索引,查询还是慢。下次遇到慢查询时,深呼吸,打开EXPLAIN,让我们开始愉快的优化之旅吧!更可怕的是,这样的慢SQL在日志里像病毒一样疯狂复制,每秒钟触发上百次!

StackOverthink的博客 1030

控制科学与工程(自动化)保研经验【2】——南开、同济篇

禁止转载 1、南开人工智能学院夏令营   保研之旅第一个夏令营就是南开,南开夏令营非常早(6月份),当时我们专业仅有两人入营。夏令营前一天我们两个坐高铁来到了天津,几经辗转来到了南开的津南校区,非常偏僻。在自己找的酒店住了一晚,第二天一早去学院报到,资格审查、报销路费等等,然后开营仪式,吃饭,入住酒店,实验室参观。   开营仪式和实验室参观了解到,南开人工智能学院是国内第一批人工智能学院,和很多高...

Control Everything 6532

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

一次真实的MySQL慢查询优化实战:从15秒到0.02秒的蜕变之路!!!

索引不是越多越好:维护索引也要成本,联合索引比多个单列索引更高效范围查询是索引杀手:尽量把范围查询字段放在联合索引最后警惕隐式转换:字段类型不匹配会导致索引失效(比如字符串存成数字)排序也要命:大数据量排序优先考虑覆盖索引统计类查询可以耍流氓:适当降低实时性要求换取性能(最后送大家一句话:优化永无止境,但要避免过度优化!下次遇到慢查询时,记得按这个流程一步步排查。如果还是搞不定…欢迎在评论区留言求救!(记得脱敏你的SQL哦~)

algonaut的博客 794

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

慢SQL优化实战:手把手教你从5秒到0.1秒的蜕变之路

优化就像治病,最忌讳"头痛医头脚痛医脚"。去年我们团队做过一个统计:70%的慢查询问题通过调整业务逻辑解决,而不是纯技术优化。比如把实时统计改为定时任务,或者在前端增加过滤条件。最好的优化,是让查询不必执行!(这句话值十个鸡腿🍗)下期预告:《EXPLAIN结果全字段解析:从入门到入土》 👨💻有什么想看的优化场景欢迎评论区点菜~

notion2025的博客 1111

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL慢查询优化实战:从10秒到0.1秒的8个技巧

数据库查询性能优化是后端开发的核心课题,其本质是通过索引优化、SQL改写和架构调整减少IO消耗与CPU计算量。索引遵循最左前缀原则和三星索引原则可避免全表扫描,而执行计划分析能快速定位性能瓶颈。在工程实践中,慢查询日志和Arthas工具链的组合诊断,配合Prometheus监控体系,形成完整的性能优化闭环。本文通过电商订单查询、用户分页等典型场景,详解如何运用复合索引、UNION ALL改写、分库分表等方案,实现查询速度百倍提升,特别适用于高并发下的MySQL性能调优。

weixin_31423955的博客 213

MySQL慢查询优化实战:从17秒到300毫秒的性能蜕变

在数据库性能优化中,索引设计与SQL执行效率是核心议题。理解数据库如何通过索引快速定位数据、避免全表扫描,是提升查询性能的关键。索引的本质是数据结构,它通过B+树等组织方式,将随机I/O转化为顺序I/O,从而大幅减少数据访问的磁盘开销和CPU计算时间。其技术价值在于,良好的索引策略能支撑海量数据下的高并发查询,保障系统响应速度与稳定性。典型的应用场景包括电商订单查询、日志分析和报表统计等涉及大表关联与条件筛选的业务。本文通过一个订单查询的实战案例,深入剖析了因索引缺失导致的**慢查询**问题,并演示了如何通

weixin_30514745的博客 708

慢SQL优化实战:从5秒到0.05秒的蜕变之旅(真实案例拆解)

精准定位问题(慢查询日志)深入分析证据(执行计划)合理使用工具(索引、参数、缓存)勇于推翻重来(SQL重构)记住:没有最好的优化方案,只有最适合业务场景的方案!下次遇到性能问题,希望你能笑着面对(而不是像我一样被老板请喝茶…)#MySQL优化 #慢查询 #SQL调优 #数据库性能 #索引优化。

syntaxsage的博客 969

MySQL索引优化实战从慢查询到高性能的蜕变之路

通过这次优化实践,我总结了MySQL索引优化的核心原则:1. 理解业务查询模式,针对高频查询设计索引2. 掌握最左前缀原则,合理设计复合索引字段顺序3. 定期分析慢查询,使用EXPLAIN工具诊断性能瓶颈4. 避免过度索引,每个索引都会增加写操作开销5. 结合数据库版本特性,使用覆盖索引、索引下推等高级优化技术索引优化是一门艺术,需要在理论知识和实战经验之间找到平衡。从慢查询到高性能的蜕变之路,正是不断学习、实践和总结的过程。

tqt_xy的博客 471

SQL优化实战:从慢查询到高性能的蜕变之路

在数据库性能调优的战场上,SQL优化始终是开发者手中的“利刃”。据统计,70%以上的数据库性能问题源于低效的SQL查询,而通过科学的优化策略,可将查询性能提升10倍甚至百倍。本文将以“SQL优化”为核心关键词,结合生产环境真实案例,系统解析索引策略、查询重写、EXPLAIN工具应用等关键技术,助你打造高性能数据库应用。

Start_mswin的博客 852

MySQL查询性能优化的10大技巧从慢查询到秒级响应

重点关注type列(连接类型)、key列(使用的索引)和rows列(扫描的行数),这些信息是优化查询的第一步。一个缓慢的查询可能成为整个系统的瓶颈,而优化的查询则能带来秒级甚至毫秒级的响应。设置合适的long_query_time阈值,定期分析慢查询日志,找出需要优化的SQL语句。通过以上10大技巧的综合应用,结合持续的监控和调优,可以有效提升查询性能,实现从慢查询到秒级响应的转变,为应用程序提供更好的用户体验。对于低选择性的列(如性别),创建索引可能不会带来明显的性能提升,甚至可能降低性能。

yxb199100的博客 439

MySQL索引优化实战:从原理到慢查询解决

数据库索引是提升查询性能的核心技术,其本质是通过B+树数据结构将随机IO转换为顺序IO。理解索引工作原理后,工程师可以遵循最左前缀原则、区分度公式等黄金法则进行优化。在实际业务场景中,合理使用EXPLAIN分析执行计划、避免索引失效陷阱(如隐式类型转换)至关重要。本文通过电商系统慢查询案例,演示如何通过复合索引将查询从6秒优化到0.2秒,并分享覆盖索引、索引下推等进阶技巧。针对大数据量分页、JSON字段查询等特殊场景,提供了游标分页、函数索引等解决方案,帮助开发者构建完整的MySQL性能优化体系。

weixin_31155097的博客 28

MySQL查询优化实战从慢查询到毫秒级响应的性能飞跃

执行计划中的几个核心字段需要重点关注:- `type`:访问类型,从优到劣大致为`system` > `const` > `eq_ref` > `ref` > `range` > `index` > `ALL`。- `Extra`:包含额外信息,如`Using where`、`Using temporary`(使用临时表,需警惕)、`Using filesort`(使用文件排序,需优化)等。例如,用`INT`而非`VARCHAR`存储数字,用`DATETIME`而非`VARCHAR`存储时间。

egous的博客 424
上一篇: 用Python绘制动态樱花树(附完整源码解析)
下一篇: 从零开始搭建学生信息管理系统(MySQL实战篇)
普通网友
博客等级 码龄2年 82粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值