慢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语句的执行计划,找出可能的性能瓶颈,并针对性地进行优化。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【并发程序设计】14.消息队列

14.消息队列 消息队列(Message Queue)是一种通信机制,用于在分布式系统中传递和管理消息的队列型数据结构。 消息队列通常是一个先进先出(FIFO)的数据结构,它允许多个进程或线程之间以异步方式进行通信。…

Google力作 | Infini-attention无限长序列处理Transformer

更多文章,请关注微信公众号:NLP分享汇 原文链接:Google力作 | Infini-attention无限长序列处理Transformerhttps://mp.weixin.qq.com/s?__bizMzU1ODk1NDUzMw&mid2247485000&idx1&sne44a7256bcb178df0d2cc9b33c6882a1&chksm…

OpenCV 的几种查找图像中轮廓边缘的方法

原始图片: 1、Sobel() Sobel 算子结合了高斯平滑和微分,用于计算图像的梯度,从而突出显示边缘。 import cv2# 读取图像 image cv2.imread(image.png, cv2.IMREAD_GRAYSCALE)# 使用 Sobel 算子查找水平和垂直边缘 sobel_x cv2.Sobel(image…

浅谈旧项目如何添加新依赖

Spring项目创建之后,还想添加新的依赖(如Spring框架内置的依赖),可以安装插件: 装完该插件之后,就可以在pom.xml文件里,右键选择 Generate即可出现下述界面: 点击ok即可添加新的…

服务器硬件基础知识学习

服务器硬件基础知识涵盖了从CPU到存储,再到网络连接和总线技术等关键组件。 1. 处理器 - 两大流派:我们常用的处理器主要分为Intel和AMD两大阵营。Intel的Xeon系列和AMD的EPYC系列都是专为服务器设计的,它们支持多核处理,能够应对…

最新一站式AI创作中文系统网站源码+系统部署+支持GPT对话、Midjourney绘画、Suno音乐、GPT-4o文档分析等大模型

一、系统简介 本文将介绍最新的一站式AI创作中文系统(集成ChatGPTMidjourneySunoStable Diffusion)——星河易创AI系统,该系统基于ChatGPT的核心技术,融合了自然语言问答、绘画、音乐、文档分享、图片识别等创作功能,…

统信UOS桌面操作系统1070上使用notepad--文本编辑器

原文链接:统信UOS桌面操作系统1070上使用notepad–文本编辑器 Hello,大家好啊!今天我要向大家推荐一款在统信UOS桌面操作系统1070上非常好用的文本编辑器软件——“notepad–”。这款软件功能强大、操作简便,特别适合开发人员和日…

enum4linux一键查询SMB信息(KALI工具系列十六)

目录 1、KALI LINUX简介 2、enum4linux工具简介 3、在KALI中使用enum4linux 3.1 目标主机IP(win) ​编辑 3.2 KALI的IP 4、操作示例 4.1 运行工具 4.2 列出用户名 4.3 提取用户名 4.4 使用自定义RID范围 4.5 列出组 4.6 列出共享文件夹 4.7…

自动评论自动私信引流系统,自动化时代的挑战与机遇

随着科技的飞速发展,自动化技术已经渗透到我们生活的方方面面。从工业生产线上的机械臂到家庭中的智能助手,自动化不仅改变了我们的工作方式,也在重塑着社会的面貌。然而,在享受自动化带来的便利和效率的同时,我们也必…

时间序列的谱分解pt.2

16.dvi (berkeley.edu)https://www.stat.berkeley.edu/~bartlett/courses/153-fall2010/lectures/16.pdfpt1 时间序列的谱分解-CSDN博客

Linux--Socket编程基础

一、Socket简介 套接字( socket )是 Linux 下的一种进程间通信机制( socket IPC ), 使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信(网络通信),当然也可以是同一台…

深度学习之加宽全连接

1.Functional API 搭建神经网络模型 1.1.利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_spli…

【免费Web系列】JavaWeb实战项目案例三

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 部门管理开发 1. 删除部门 1.1 需求分析 删除部门数据。在点击 "删除" 按钮,会根据ID删除部门数据。 了解了需求之后,我们再看看接口文档中,关于删除部门…

还没搞懂作用域、执行上下文、变量提升?看这篇就够啦

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 作用域(Scope) 全局作用域 函数作用域 块级作用域…

编译选项导致的结构体字节参数异常

文章目录 前言问题描述原因分析问题解决总结 前言 在构建编译工程时,会有一些对应的编译配置选项,不同的编译器,会有对应的配置项。本文介绍GHS工程中编译选项配置不对应导致的异常。 问题描述 在S32K3集成工程中,核1的INP_SWC…

【并发程序设计】15.信号灯(信号量)

15.信号灯(信号量) Linux中的信号灯即信号量是一种用于进程间同步或互斥的机制,它主要用于控制对共享资源的访问。 在Linux系统中,信号灯作为一种进程间通信(IPC)的方式,与其他如管道、FIFO或共享内存等IPC方式不同&…

c++ 哈希 unordered_map unordered_set 的学习

1. unordered 系列 在 c98 中, STL 提供了底层是红黑树结构的一系列关联式容器,set 和 map 的查询效率可以达到 log2N,红黑树最差的情况也只是需要比较红黑树的高度次,当节点数量非常多时,查找一个节点还需要比较几十…

护肤品美妆商城小程序的作用是什么

经营美妆的方式多种多样,商场街边、电商平台、微商等,无论厂商品牌还是经销商批发零售都有大量目标群体,客户在哪里商家就应该在哪里,私域生意模式,商家需要线上多渠道获客转化和提高营收。 运用【雨科】平台搭建护肤…

PatchEmbed

PatchEmbed 是用于计算机视觉任务的神经网络层,特别是在Vision Transformer (ViT) 模型中使用。它负责将输入的图像分割成固定大小的图像块(patches),并将这些图像块线性嵌入到高维空间中。这是Vision Transformer处理图像的方式&…

JVM虚拟机性能监控工具

命令行工具 jps 虚拟机进程状况查询工具 jps(JVM Process Status Tool),可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称或者jar文件名,还有这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。 # …