慢SQL的治理思路

慢SQL的治理思路

  • 什么是慢SQL
  • 慢SQL产生的原因
  • 查看慢 SQL 是否开启
  • 开启慢 SQL 记录开启慢查询日志
  • 分析慢 SQL
  • 解决和优化慢SQL的方法

什么是慢SQL

慢 SQL 指的是 MySQL 中执行比较慢的 SQL,排查慢 SQL 最常用的方法是通过慢查询日志来查找慢 SQL。 MySQL 的慢查询日志是 MySQL 提供的一种日志记录,它用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过 long_query_time 值的 SQL,就会被记录到慢查询日志中,long_query_time 的默认值为 10s,意思是运行超过 10s 以上的语句就会被当做慢 SQL 记录到日志中。

慢SQL产生的原因

  • 缺乏索引或索引未生效:当查询未命中索引或索引未生效时,数据库可能需要进行全表扫描,这会消耗大量的I/O资源,从而导致查询速度变慢。
  • 单表数据量太大:当表中的数据量非常大时,即使使用了索引,查询速度也可能受到影响,因为索引的维护成本会随着数据量的增加而增加。
  • SQL语句书写不当:例如使用了过多的JOIN或子查询、IN元素过多、LIMIT深分页问题、ORDER BY导致文件排序、GROUP BY使用临时表等,这些都会导致查询效率降低。
  • 数据库在刷“脏页”:当数据库在刷“脏页”(即将内存中的修改数据页写回磁盘)时,如果redo log写满了,会导致所有系统更新被堵住,无法写入,从而影响查询性能。
  • 锁等待:在执行SQL时,如果遇到表锁或行锁,查询需要等待锁被释放,这也会导致查询速度变慢。

查看慢 SQL 是否开启

可以使用 SQL 命令来查看慢 SQL 记录功能是否开启,使用

 mysql> show variables like '%slow_query_log%'; 

来查询慢查询日志是否开启,执行效果如下图所示:
在这里插入图片描述
slow_query_log 的值为 OFF 时,表示未开启慢查询日志。

开启慢 SQL 记录开启慢查询日志

可以使用如下 MySQL 命令:

mysql> set global slow_query_log=1

不过这种设置方式,只对当前数据库生效,MySQL 重启也会失效
如果要永久生效,就必须修改 MySQL 的配置文件 my.cnf :

slow_query_log =1slow_query_log_file=/tmp/mysql_slow.log

分析慢 SQL

得到慢 SQL 之后,可以通过 explain 执行计划分析 MySQL 执行慢的原因并进行优化,比如以下这样:
在这里插入图片描述
其中最重要的就是 type 字段,type 值类型如下:

  • all — 扫描全表数据
  • index — 遍历索引
  • range — 索引范围查找
  • ndex_subquery — 在子查询中使用
  • refunique_subquery — 在子查询中使用
  • eq_refref_or_null — 对 null 进行索引的优化的
  • reffulltext — 使用全文索引ref — 使用非唯一索引查找数据
  • eq_ref — 在 join 查询中使用主键或唯一索引关联
  • const — 将一个主键放置到 where 后面作为条件查询, MySQL 优化器就能把这次查询优化转化为一个常量,如何转化以及何时转化,这个取决于优化器,这个比 eq_ref 效率高一点。

如果 type=all 说明没走索引,此时就需要给查询慢的字段加上相应索引就可以提高查询效率。 当然,优化慢 SQL需要综合考虑的因素有很多,比如索引、查询优化(减少联表查询等)、减少锁竞争等因素,所以具体的慢 SQL优化,需要根据实际的业务场景再做优化决策。

解决和优化慢SQL的方法

  • 优化数据访问:
    使用LIMIT子句缩减数据行数。
    避免使用SELECT *,只选择需要的列。
    分解大查询为多个小查询,减少每次查询的数据量。
  • 索引优化:
    为查询的字段建立合适的索引,避免全表扫描。
    分析查询语句,确定需要加索引的字段,并选择适当的索引类型。
    使用覆盖索引,当索引中的列包含所有查询中需要使用的列时,可以避免回表操作,提高查询性能。
    避免索引失效,例如避免对索引列进行函数操作或未遵循最左匹配原则等。
  • 查询语句优化:
    分解联表查询,将复杂的联表查询分解为多个单表查询,然后在业务层聚合数据。
  • 优化排序操作,对排序字段建立索引,避免文件排序。
    分析和重写复杂的子查询和JOIN操作,提高查询效率。
  • 数据库参数调优:
    根据数据库的配置和硬件环境,调整数据库的参数,如缓冲区大小、连接数等,以优化性能。
  • 分表分库:
    对于非常大的数据表,考虑进行分表或分库操作,将数据分散到多个表或数据库中,以提高查询性能。
  • 增加缓存:
    对于频繁读取的热点数据,可以将其放入缓存中(如Redis),减少对数据库的访问压力。
  • 使用数据库管理工具:
    利用数据库管理工具分析SQL语句的执行计划,找出可能的性能瓶颈,并针对性地进行优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/339475.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习复盘与论文复现B

文章目录 1、Knowledge Review1.1 NLLLoss vs CrossEntropyLoss1.2 MNIST dataset1.2.1 Repare Dataset1.2.2 Design Model1.2.3 Construct Loss and Optimizer1.2.4 Train and Test1.2.5 Training results Pytorch-Lightning MNIST :rocket::fire:1.3 Basic Convolutional Neu…

961题库 北航计算机 计算机网络 附答案 简答题形式

有题目和答案,没有解析,不懂的题问大模型即可,无偿分享。 第1组 习题 某网络拓扑如题下图所示,其中 R 为路由器,主机 H1~H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如图中所示。现有若干以太网交换机…

Flask发送邮件有哪些步骤?怎么保障安全?

Flask发送邮件的模板如何设置?如何测试邮件发送功能? 无论是账户激活、密码重置,还是通知提醒,邮件系统的集成都显得尤为重要。AokSend将详细介绍如何在Flask应用中实现发送邮件的功能,并分步骤讲解其具体实现过程。 …

【Qt系列教程】一、认识Qt、安装Qt、运行Hello Qt

文章目录 1.1 Qt 简介1.2 Qt 的安装1.3 编写 Hello World 1.1 Qt 简介 Qt(官网:https://www.qt.io)于1995年5月首次公开发布,是一个跨平台的应用程序开发框架,也是最主流的 C 开发框架; Qt 具有其他编程…

Qt6.7 Android第一次尝试

安装qt online installer https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/qt-unified-windows-x64-online.exe选择Android 和 Desktop, 然后默认安装 安装完成后设置Android Sdk, 这里可以直接使用在线下载(因为我也不会怎么配置Android SDK和…

界面控件DevExpress WinForms的流程图组件 - 可完美复制Visio功能(一)

DevExpress WinForms的Diagram(流程图)组件允许您复制Microsoft Visio中的许多功能,并能在下一个Windows Forms项目中引入信息丰富的图表、流程图和组织图。 P.S:DevExpress WinForms拥有180组件和UI库,能为Windows F…

挂上了代理加速器梯子之后,Git clone指令下载仍旧很慢的问题

当你使用了各种代理软件访问诸如Github、Google、油管、推特这些网址,你会发现基本可以访问,只不过是访问速度不同,但是不管你使用什么代理软件,你的git clone指令从Github远程库下载库的速度都不会受到影响。 当使用代理软件访问…

Android精通值Fragment的使用 —— 不含底层逻辑(五)

1. Fragment 使用Fragment的目标:根据列表动态显示内容,更简洁显示界面、查找界面 eg. 使用新闻列表动态显示新闻 1.1 Fragment的特性 具备生命周期 —— 可以动态地移除一些Fragment必须委托在Activity中使用可以在Activity中进行复用 1.2 Fragmen…

稍微学学react

文章开始前,先划划水~ 今日份开心: 今天看之前发布的按钮npm包下载量有162次,早知道好好做了 今日份不开心: 爬岗位看到一个整体都挺满意的岗位,公司位置和发展大方向都好喜欢!!!…

Unity UGUI实现无限滚动列表

Demo链接: ​​​https://download.csdn.net/download/qq_41973169/89364284 在游戏开发中,列表视图是一个常见的UI组件。实现一个高效的列表视图尤其重要,尤其是在需要展示大量数据时。本文将介绍如何在Unity中实现一个高效的无限滚动列表,…

贪心算法拓展(反悔贪心)

相信大家对贪心算法已经见怪不怪了,但是一旦我们的决策条件会随着我们的步骤变化,我们该怎么办呢?有没有什么方法可以反悔呢? 今天就来讲可以后悔的贪心算法,反悔贪心。 https://www.luogu.com.cn/problem/CF865Dhttp…

100页2秒?我们为什么需要这样的文档解析速度

近期,TextIn通用文档解析完成最新一版产品迭代,将100页文档解析速度提升至最快2秒以内。 P50(百页) P90(百页) P95(百页) P99(百页) 平均(单页…

C++:list模拟实现

hello,各位小伙伴,本篇文章跟大家一起学习《C:list模拟实现》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!&#xf…

vue不同页面切换的方式(Vue动态组件)

v-if实现 <!--Calender.vue--> <template><a-calendar v-model:value"value" panelChange"onPanelChange" /></template> <script setup> import { ref } from vue; const value ref(); const onPanelChange (value, mod…

MySQL—函数—数值函数(基础)

一、引言 首先了解一下常见的数值函数哪些&#xff1f;并且直到它们的作用&#xff0c;并且演示这些函数的使用。 二、数值函数 常见的数值函数如下&#xff1a; 注意&#xff1a; 1、ceil(x)、floor(x) &#xff1a;向上、向下取整。 2、mod(x,y)&#xff1a;模运算&#x…

基于Springboot + vue实现的文化民俗网站

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

字节裁员!开启裁员新模式。。

最近&#xff0c;互联网圈不太平&#xff0c;裁员消息此起彼伏。而一向以“狼性文化”著称的字节跳动&#xff0c;却玩起了“低调裁员”&#xff0c;用一种近乎“温柔”的方式&#xff0c;慢慢挤掉“冗余”的员工。 “细水长流”&#xff1a;裁员新模式&#xff1f; 不同于以往…

2024年Google算法更新打击低质量(如AI生成)内容后,英文SEO优化人员该如何调整谷歌SEO优化策略?

3月5日&#xff0c;谷歌发布了2024年的首次算法更新。与以往更新不同&#xff0c;本次更新更加复杂&#xff0c;这次更新旨在提高搜索结果的质量和相关性&#xff0c;可能对外贸网站排名和流量产生显著影响。也将产生更大的网站数据波动。但在担心自己的网站数据受到影响之前&a…

【wiki知识库】04.SpringBoot后端实现电子书的增删改查以及前端界面的展示

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日内容 二、&#x1f30f;前端页面的改造 2.1新增电子书管理页面 2.2新增路由规则 2.3修改the-header代码 三、&#x1f697;SpringBoot后端Ebook模块改造 3.1增加电子书增/改接口 3.1.…

数据挖掘 | 实验三 决策树分类算法

文章目录 一、目的与要求二、实验设备与环境、数据三、实验内容四、实验小结 一、目的与要求 1&#xff09;熟悉决策树的原理&#xff1b; 2&#xff09;熟练使用sklearn库中相关决策树分类算法、预测方法&#xff1b; 3&#xff09;熟悉pydotplus、 GraphViz等库中决策树模型…