项目上线后我是如何通过慢查询和索引让系统快起来的

MySQL 性能调优入门 - 慢查询分析与索引优化基础 MySQL性能调优核心在于慢查询分析与索引优化。首先应基于监控数据诊断问题,明确问题范围和类型。慢查询是常见性能瓶颈,需启用慢查询日志并合理设置阈值,使用pt-query-digest等工具分析。EXPLAIN命令至关重要,能显示查询执行计划,重点关注type列(避免ALL全表扫描)和Extra列(警惕临时表和文件排序)。索引优化的基本原则是为WHERE、JOIN、ORDER BY等条件创建合适索引,但需权衡读写性能。性能调优应遵循"监控-分析-优化-验证"的闭环流程。 阅读详情

1、前言

最近对mysql的操作比较多一些,主要是项目上线以后,难免会有一些数据上的问题。开始的时候还主要由后端来处理,后面数据问题确实比较多,于是我就找后端要来服务器的账号密码,连上数据库顺便来看看数据的问题。 

​周五使用人数达到了高峰,总共有5300人在使用,今天截图的时候是周六人数略有减少。

​这是三个表数据比较大的表,目前大致运行两周的时间就已经很大了。

​这是数据量最多的一张表,大致已经410W条记录了。

算是一个小小的系统,不算大,但是从目前数据量的增加来看,慢慢的数据量可能会越来越大。

2、mysql 索引

最开始项目刚上线的时候,因为没有数据,所以根本没什么感觉,突然某一天,就感觉到接口的响应时间明显的变慢了。但其实后端并没有什么线上的经验,所以我借机就要来了服务器的账号密码。基本上除了主键以外,没有加任何的索引。打到数据库上的查询就实打实的有一些慢了,(虽然这里使用了一主四从),四个从库相当于都是用来做查询使用的,但是在没有索引的情况下,真的有点慢了。我跟后端稍作沟通,我就准备直接在正式环境添加数据库表的索引了。

这是平常小程序里接口的返回时间记录。而且有时候根据访问人数的不同,偶尔有时候会到三秒到四秒。

​ 3、打开慢查询记录开关

那么能否通过专业的工具去查看呢?首先我做的第一件事情便是,查看一下mysql的慢查询是否有打开,好家伙,还不错,竟然打开了。如果没开启可以开启一下:

// 查看慢查询日志是否开启  on为开启  off为关闭 默认是关闭的
show variables like 'slow_query_log';

// 设置是否开启慢查询日期记录
set global slow_query_log = on;    #开启
set global slow_query_log = off;   #关闭

// 查看慢查询的阈值(默认是10秒)
show variables like 'long_query_time';

// 如果想修改慢查询的阈值

// 阈值设置为1秒
set global long_query_time = 1;   

// 查看慢查询日志文件路径
show variables like 'slow_query_log_file';

如果慢查询记录log没有打开,可以参考一下这篇文章:juejin.cn/post/716761…

4、通过mysqldumpslow 查询慢查询sql

下面是常用的几个查询慢SQL的脚本语句

// 得到返回记录集最多的10条SQL:
mysqldumpslow -s r -t  10 /var/lib/mysql/slow.log

// 得到访问次数最多的10条SQL:
mysqldumpslow -s r -t  10 /data/mysql/slow.log

// 得到按照时间排序的前10条里面含有左连接的SQL:
mysqldumpslow -s t -t 100 -g "left join" /var/lib/mysql/slow.log

// 也支持管道符命令
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow.log | more //分页显示

执行后结果如下所示,一目了然

可以查看到第一个sql 平均耗时2.94s,这个sql不论在哪里使用都会感觉慢了。所以这个时候查看sql以后,可以使用explain + sql 在mysql客户端执行,查看执行计划

​可以查看返回结果,我平常观察最多的几个字段便是 type、 rows、Extra、等字段。

如果你想详细了解 explain的执行计划,你可以访问如下链接来重点阅读: juejin.cn/post/716359…

5、直接添加索引

我简单可以总结为如下:

  1. join 后看表关联的字段

  2. where 后看查询条件的字段

  3. group by order by 后的 分组条件和排序条件

在有条件的时候,上述地方能加索引就加索引,但是通常一张表添加五个索引就算比较多的,因为如果一张表索引过多在其他地方,比如存储、添加、删除的时候都会重新整理索引,成本消耗会很大。

​目前来说这种简单粗暴的方式,在几百万数据的量级完全解决了我的问题,这里展示了我随便找的一张表,里面添加了四个索引,这里完全可以用四个字段的普通索引即可,我这里当时为了验证联合索引或者叫复合索引就没改了,目前来看效果还是嘎嘎的香,随着数据量的增加我猜测索引会有调整。

6、重置慢查询日志

假如我们优化完毕了,正式环境重新部署了,我们想查看一下效果,比如想去查询一下慢查询的日志记录,但是之前的日志记录还在,这个时候我们应该怎么办呢?

// 通过rm直接删除慢查询日志记录文件
rm slow.log

// 然后记得要重置慢查询才会开启继续登录

// 在 mysql所在的linux服务器上执行
mysqladmin -uroot -p flush-logs slow

//或者在mysql数据库中执行
mysql> FLUSH LOGS;

重置后可查看slow.log是否重新生成。

7、注意事项

  • 尽量禁止使用 select * 进行查询:减少IO和传递压力等
  • 查询条件的类型尽量与数据库里的类型一致:不一致可能导致索引失效
  • group by 后如果不想排序 可以在后面添加order by null
  • 查询计划中尽量避免全表扫描
  • 每张表都要设置主键,因为不设置mysql会自动帮我们设置
  • 主键最好不要用GUID,尽量自增ID(GUID插入时时无序的)
  • 明确只返回一条记录的sql 可以加上limit 1
  • 联合索引(复合索引)查询时要注意查询字段的顺序
  • 如果可以尽量给字段设置默认值,不要为null空值,null在一定程度上会造成索引失效
  • like 模糊查询尽量不要以% 开头,因为会造成索引失效
  • 一个sql关联的表不要过多(通常最多三到五个)
  • 多表查询时一定先以小表查询,再来查询大表,也就是小表驱动大表
  • 尽量少用or会造成索引失效,有些时候可以使用union all替换
  • 当然还有其他的,暂时在项目使用就这么多

8、总结

一种情况时找到具体接口中使用的sql,如果很慢进行优化sql或者添加索引,另外一种时通过mysql工具查找到记录的慢查询sql,可以直接根据表结构进行添加索引,如果很复杂,而且简单的增加索引无法提速,可能要根据具体业务进行分析调整再添加索引。总之索引的使用在大部分情况下是非常有效的。 通过explain 查看sql执行计划,进行优化索引和表设计,因为在某些情况合理的表结构默认值设置、或者表关联字段设置,都能有效的避免全表扫描。 总之不要怂,加错了索引,大不了花点时间删除就好了。

MySQL慢查询优化实战:从索引失效到服务器配置调优 数据库性能优化常被误解为升级硬件就能解决,但实际瓶颈往往藏在SQL写法、索引设计、锁等待和配置参数中。本文从慢查询的本质出发,讲解如何通过慢查询日志定位问题,利用EXPLAIN分析执行计划,识别索引失效的典型场景,并介绍深分页优化、Redis缓存热点数据、读写分离等架构手段。同时,针对InnoDB缓冲池等关键配置项和操作系统层面的调优给出实用建议,帮助读者在复杂业务场景中建立从排查到治理的完整方法论,真正避免“高配低效”的陷阱。无论你是运维工程师还是后端开发者,都能从中获得可落地的优化思路。 阅读详情

相关推荐

MySQL慢查询优化实战:从执行计划到索引设计的闭环诊断

慢查询是数据库性能问题的核心表征,其本质并非简单缺乏索引,而是查询路径与数据分布、成本模型、执行计划三者失配的结果。MySQL优化器基于统计信息与IO成本模型决策,当索引区分度低、条件未满足最左前缀、存在隐式转换或统计过期时,即使建索引也常被弃用。技术价值在于通过慢查询日志(尤其log_slow_extra开启的query_plan快照)、标准化SQL指纹归一化、EXPLAIN六维字段精读及ANALYZE校准,实现可验证的根因定位。典型应用场景涵盖高并发分页、多条件过滤、报表聚合等,最终需经灰度重放与业务指

weixin_30918633的博客 380

java排查耗时代码的几种方式

(如果你的系统是windows执行不了这些命令,强烈建议装一个wsl1,IDEA支持把代码跑在wsl里了,调试起来会非常舒服,wsl2目前与windows本体的文件交换机制是网络传输,性能很差不建议。命令是用来获取当前的线程栈信息,也就是它的结果是瞬时的,如果我们的实际应用场景比较复杂,往往需要采样一段时间内的运行情况,再找出这段时间内总耗时最多的方法。这个火焰图是可以交互的,例如左上角的放大镜按钮可以用来高亮出包含关键字的矩形,如果方法调用层次太深,也可以点击某个矩形,只查看此矩形之上的部分。

imliuyu的博客 8912

MySQL——选错索引导致的线上慢查询事故

采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。所以在不加强制索引的情况下,优化器选择了主键索引,因为它觉得主键索引扫描行数少,而且不需要额外的排序操作,主键索引天生有序。这样也有一定的弊端,比如我这个表到了8000w数据,建立索引非常耗时,而且通常索引就有3.4个g,如果无限制的用索引解决问题,可能会带来新的问题。高耦合,这种语句写在代码里,会变得难以维护,如果索引名变化了,或者没有这个索引了,代码就要反复修改。

庄小焱 666

Java线上问题排查系列--后端接口响应慢的排查方法及解决方案

本文介绍Java后端接口响应慢的排查的方法以及如何解决。

IT利刃出鞘的博客 2万+

数据库查询慢的原因总结

个人收集的关于数据库查询优化的资料! 共有50条!

Unity FPS射击控制系统:数据驱动的武器行为解耦方案

在Unity第一人称射击(FPS)开发中,射击系统常因输入、状态、行为耦合导致连发异常、换弹冲突与网络同步失准。其本质是缺乏对‘武器行为’(如后坐力曲线、弹药逻辑)与‘射击控制’(如输入合法性校验、冷却调度)的正交分离。本方案基于ScriptableObject实现WeaponData数据资产化,配合ShootingController状态机服务,达成输入解耦、运行时参数可调、协程受控、网络预测友好等工程目标。适用于中大型FPS项目架构升级与数据驱动转型,尤其解决Unity InputSystem与物理反馈

weixin_30536861的博客 615

什么是慢查询——Java全栈知识(26)

慢查询:也就是接口压测响应时间过长,页面加载时间过长的查询原因可能如下:1、聚合查询2、多表查询3、单表数据量过大4、深度分页查询(limit)

dghehe的博客 548

管道机器人手臂机械结构设计cad【8张】+三维图+设计说明书+绛重

履带式管道机器人适用于各种管道环境,包括直管道、弯曲管道、水平管道、垂直管道等,其灵活性和适应性使得它可以应对不同形状和尺寸的管道,完成全面的检测和维护工作。管道机器人研究具有重要的现实意义和深远的社会影响,通过提高工作效率、降低人员风险、提升服务质量、节约成本资源和促进科技创新等方面的作用,为现代工程技术领域的发展和进步做出了积极的贡献。管道机器人是一种能够在管道内部执行各种任务的智能机器人,而管道机器人的机械臂对于管道机器人在管道内执行任务的灵活性、稳定性和效率至关重要。

kejigongjiang的博客 948

面试题之如何排查代码程序慢问题

排查Java代码性能问题是一个系统性的工作,通常需要结合不同的工具和方法来定位和解决问题。以下是一些常见的排查步骤和方法。

ny_forever的博客 2056

告别GPS,用Sentinel-1数据+Python实战SBAS-InSAR监测城市地面沉降(保姆级教程)

本文详细介绍了如何利用Sentinel-1数据和Python实现SBAS-InSAR技术监测城市地面沉降。通过保姆级教程,从环境配置、数据获取到干涉处理、时序分析和形变反演,逐步解析全流程技术细节,帮助读者掌握毫米级精度的形变监测方法,并以上海陆家嘴区域为例展示实际应用效果。

weixin_32771907的博客 536

提升RAG效果:为何 JSON 格式远胜 Markdown?

在构建强大的 RAG (检索增强生成) 系统时,文档解析是至关重要的第一步。它直接影响着后续的检索效率和生成质量。在众多文档格式中,JSON (JavaScript Object Notation) 格式正逐渐展现出其相对于传统 Markdown 格式的巨大优势。本文将深入探讨 JSON 在 RAG 系统文档解析中的卓越之处,并结合具体案例,让你理解为何 JSON 才是构建下一代智能应用的更优选择。RAG 系统的核心目标是让模型能够利用外部知识库,生成更精准、更贴合实际的答案。

simoncool23的博客 2719

Java和Mysql——查询性能优化

针对数据查询缓慢的优化

qq_42706375的博客 3430

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现

在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 273

慢查询、慢查询优化、索引失效

1.什么是慢查询? 所有执行时间超过 long_query_time 秒的所有查询或不适用于索引的查询。 2.long_query_time默认时间是10秒,即超过10秒的查询都认为是慢查询。 3.慢查询日志默认名称:主机名-slow.log 4.除了查看my.ini文件以外通过 show variables like '%quer%' 查看 4.1 slow_query_log:表示是否开启慢查询日志。(默认开启) 开启后查询是慢查询,则该查询记录会存储到slow_...

m0_60552721的博客 5076

PD3.0详解 协议的时序timer和counter计数

前面介绍了关于PD协议的交互,还有协议层数据各个字段的含义,但是一直没有系统的说关于协议的时序,还有部分counter,就是协议允许发送的次数,或者一些其他计数。 大师匈今天说一下关于这方面的东西,这些东西都是非常关键的东西,但是相对来说PD标准内对时序的要求还是比较宽泛,非常容易能够实现这样的要求。 Timer 1、CRCReceiveTimer 0.9~1.1ms 表示每次通信收到goodcrc的时间,必须在这个时间内收到goodcrc, 我们要注意不是在0.9~1.1ms内,而是第三方可以在这个范

大师匈的博客 5008

保姆级YOLOv8改进 | 基于DWRSeg扩张式残差机制的小目标检测优化(附修改后的C2f与Bottleneck模块)

DWRSeg机制:通过动态权重调整和扩张卷积有效提升了小目标的检测能力。C2f和Bottleneck模块修改:通过集成DWRSeg模块,增强了特征提取和残差学习能力。实验结果:在多个应用场景中,改进后的YOLOv8展现了更高的检测精度,特别是在小目标检测中表现突出。

一键难忘的博客 3221

数据库优化——慢查询MySQL定位优化流程

如何定位并优化慢查询SQL?如何使用慢查询日志?本文带来慢查询例子演示,新手都能看懂!那查询语句慢怎么办?explain带你分析sql执行计划!当主键索引、唯一索引、普通索引都存在,查询优化器如何选择?本文带你一探究竟!

卓越无关环境,保持空杯心态——靡不有初,鲜克有终 1万+

MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能

该MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能。输出曲线可直接用于验证设计的合理性(如是否存在过流面积突变或不足)。的不同范围,选择对应的几何模型计算过流面积。通过分段逻辑计算柱塞腔在不同旋转角度(过流面积在特定条件下会被限制(如。),确保结果符合物理实际。条件分支,根据旋转角度。

huanghm88的专栏 584

MySQL数据库慢查询问题排查方法

最近碰到了几次数据库响应变慢的问题,整理了一下处理的流程和分析思路,执行脚本。希望对其他人有帮助。 MySQL慢查询表现 明显感觉到大部分的应用功能都变慢,但也不是完全不能工作,等待比较长的时间还是有响应的。但是整个系统看起来就非常的卡。 查询慢查询数量 一般来说一个正常运行的MySQL服务器,每分钟的慢查询在个位数是正常的,偶尔飙升到两位数也不是不能接受,接近100系统可能就有问题了,但是还能勉...

意言堂-技术管理杂谈 9953

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

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

慢查询优化

慢查询(Slow Query)是指执行时间超过指定阈值的SQL语句。判断标准-- 查看慢查询阈值(默认10秒)-- 临时设置为1秒-- 永久配置(my.cnf)[mysqld]log_queries_not_using_indexes = 1 # 记录未使用索引的查询1. 发现问题:慢查询日志 + 监控2. 分析问题:EXPLAIN + 执行计划3. 定位原因:索引 / SQL / 数据量 / 锁4. 制定方案:索引优化 / SQL改写 / 分表5. 验证效果:性能对比 + 压力测试。

先度过菜鸟阶段 1077

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java项目上线mysql查询慢_Java MySQL慢查询优化

引言本文主要介绍MySQL中,有关慢查询的优化方案。慢查询日志是mysql的一个日志记录,可以用来记录mysql语句执行时间超过指定的long_query_time的SQL语句,long_query_time的默认值是10s慢查询日志默认情况下是不开启的,因为将数据保存到日志会对性能有一定影响,测试环境下可手动打开,但注意手动开启之后只对本次启动生效,mysql关闭之后重启恢复默认状态,要想持久生...

weixin_34107049的博客 437

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

慢查询复盘后,把索引经验沉淀为排查顺序

本文的场景、图表和数值用于说明分析方法,不代表特定线上系统的事实或性能承诺。复现时请记录版本、硬件与资源配额、输入和并发模型、预热与统计窗口,以及失败路径。本文以可复现的示例场景梳理这一问题:先说明约束和排查路径,再给出可调整的实现。文中的故障经过、数字和结果需要在相同条件下复核,不能直接外推到其他服务。

iymei4986533030的博客 5176

数据库优化—MySQL慢查询定位优化流程

分析一下:实际使用哪个索引是查询优化器决定的,B+树的叶子结点就是链表结构,遍历链表就可以统计数量,但是这张表,有主键索引、唯一索引、普通索引,优化器选择了account这个唯一索引,这肯定不会使用主键索引,因为主键索引是聚集索引,每个叶子包含具体的一个行记录(很多列的数据都在里面),而非聚集索引每个叶子只包含下一个主键索引的指针,很显然叶子结点包含的数据是越少越好,查询优化器就不会选择主键索引。这里的数据是200W条。,这里B+树已经将这个非聚集索引的索引字段的值排好序了,而不是等到查询的时候再去排序。

sjkflw121150的博客 1121

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

MySQL索引优化是一个需要权衡的艺术。更多的索引可以提高查询性能,但会增加写操作的开销和存储空间。我们的优化之路从解决一个具体慢查询开始,逐步建立起完整的索引设计、监控和优化体系。最终,那个曾经需要5秒的查询现在仅需50毫秒,系统整体性能得到了显著提升。记住,没有绝对的最优索引方案,只有最适合当前业务场景和数据特征的平衡之选。

luqipin的博客 565

系统上线流程

一、人员检查列表: 功能在QA、SIM环境的验证是否通过 负责本项目的测试是否在场,且同意功能上线 负责本项目的产品及需求方是否在场,且同意功能上线 是否通知了功能的相关方,提前培训到位 对用户的影响是什么,是否提前通知到班主任、运营、老师、销售 二、时间检查点: 是否避开了月底冲单的高峰期 是否避开了教师授课的高峰期 是否符合功能预计的上线时间 是否有别的大功能改进在同步上线,尽量避开 ...

zhou1124的博客 1493
上一篇: 你都工作两年半了,还不会RabbitMQ?
下一篇: 硬核,阿里自爆虐心万字面试手册,Github上获赞89.7K
Java佳佳
博客等级 码龄4年 216粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值