慢 SQL 的优化思路

news2024/11/16 8:25:44

分析慢 SQL

如何定位慢 SQL 呢?

可以通过 slow log 来查看慢SQL,默认的情况下,MySQL 数据库是不开启慢查询日志(slow query log)。所以我们需要手动把它打开。

查看下慢查询日志配置,我们可以使用 show variables like 'slow_query_log%' 命令,如下:

  • slow query log:表示慢查询开启的状态。
  • slow_query_log_file:表示慢查询日志存放的位置。

还可以使用 show variables like 'long_query_time' 命令,查看超过多少时间,才记录到慢查询日志,如下:

  • long_query_time:表示查询超过多少秒才记录到慢查询日志。

可以通过慢查询日志,定位那些执行效率较低的 SQL 语句,重点关注分析。

explain 查看分析 SQL 的执行计划

当定位出查询效率低的 SQL 后,可以使用 explain 查看 SQL 的执行计划。

当 explain 与 SQL 一起使用时,MySQL 将显示来自优化器的有关语句执行计划的信息。即 MySQL 解释了它将如何处理该语句,包括有关如何连接表以及以何种顺序连接表等信息。

一条简单SQL,使用了explain的效果如下:

一般来说,我们需要重点关注id、type、key、rows、filtered、extra。

profile 分析执行耗时

explain 只是看到 SQL 的预估执行计划,如果要了解SQL真正的执行线程状态及消耗的时间,需要使用 profiling。开启 profiling 参数后,后续执行的SQL语句都会记录其资源开销,包括IO、上下文切换、CPU、内存等等,我们可以根据这些开销进一步分析当前慢 SQL 的瓶颈再进一步进行优化。

profiling 默认是关闭的,我们可以使用 show variables like '%profil%' 查看是否开启,如下:

可以使用 set profiling=ON 开启。开启后,可以运行几条 SQL,然后使用 show profiles 查看一下:

show profiles会显示最近发给服务器的多条语句,条数由变量profiling_history_size定义,默认是 15。如果我们需要看单独某条 SQL 的分析,可以show profile查看最近一条 SQL 的分析。也可以使用show profile for query id(其中 id 就是 show profiles 中的 QUERY_ID)查看具体一条的 SQL 语句分析。

除了查看 profile ,还可以查看 cpu 和 io,如上图。

Optimizer Trace 分析详情

profile 只能查看到 SQL 的执行耗时,但是无法看到 SQL 真正执行的过程信息,即不知道 MySQL 优化器是如何选择执行计划的。这时候还可以使用 Optimizer Trace,它可以跟踪执行语句的解析优化执行的全过程。

可以使用 set optimizer_trace="enabled=on" 打开开关,接着执行要跟踪的 SQL,最后执行 select * from information_schema.optimizer_trace 跟踪,如下:

大家可以查看分析其执行树,会包括三个阶段:

  • join_preparation:准备阶段
  • join_optimization:分析阶段
  • join_execution:执行阶段

由于 trace 中的内容太长,就不贴出来了。

采取措施

  • 多数慢 SQL 都跟索引有关,比如不加索引、索引不生效、不合理等,这时候,我们可以优化索引。
  • 优化 SQL 语句,比如一些 in 元素过多问题(分批),深分页问题(基于上一次数据过滤等),进行时间分段查询。
  • SQl 若不能继续优化时可以改用 ES 的方式,或者数仓。
  • 如果单表数据量过大导致慢查询,则可以考虑分库分表。
  • 如果数据库在刷脏页导致慢查询,考虑是否可以优化一些参数。
  • 如果存量数据量太大,考虑是否可以让部分数据归档。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库学习】ClickHouse(ck)

1,ClickHouse(CK) 是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 1)特性 按列存储,列越多速度越慢; 按列存储,数据更容易压缩(类型相同、区分度)&#xff1b…

JDK安装与配置教程来啦

1.从Oracle公司官网下载JDK安装文件。 官网地址为: http://www.oracle.com/technetwork/java/javase/downloads/index.html 目前最新版本是JDK21,下面就以JDK21举例。 2.需要登录Oracle账户,没有的注册一下就行了。 3.在确认安装的盘符(例…

24-1-9 bilibilic++音视频

下午两点面试,面试官迟到了一会,面试官人很好,整体面试经历很不错,但是我人太紧张了,基础知识掌握的深度不够,没有深挖, 是做音视频的底层相关的, 实习要求只要每天打卡够九个小时就…

Python教程:使用turtle画星空

---------------turtle源码集合--------------- Python教程39:使用turtle画美国队长盾牌 Python教程38:使用turtle画动态粒子爱心文字爱心 Python教程37:使用turtle画一个戴帽子的皮卡丘 Python教程36:海龟画图turtle写春联 …

使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性

前言:什么是集成配置系统? 集成配置系统的主要目的是将应用程序的配置信息与代码分离,使得配置信息可以在不需要修改代码的情况下进行更改。这样可以提高应用程序的灵活性和可维护性。 ASP.NET Core 提供了一种灵活的配置系统,可…

Kubernetes (七) service(微服务)及Ingress-nginx

官网地址: 服务(Service) | Kuberneteshttps://v1-24.docs.kubernetes.io/zh-cn/docs/concepts/services-networking/service/ 一 . 网络通信原理 …

LLM主流框架:Causal Decoder、Prefix Decoder和Encoder-Decoder

本文将介绍如下内容: transformer中的mask机制Causal DecoderPrefix DecoderEncoder Decoder总结 一、transformer中的mask机制 在Transformer模型中,mask机制是一种用于在self-attention中的技术,用以控制不同token之间的注意力交互。具体…

JS加密/解密之js加密小工具

JS加密的原理和方法 什么是JS加密 JS加密是一种将js代码转换成不易被阅读和修改的形式的技术JS加密的目的是保护js代码的版权,防止被恶意篡改或盗用JS加密的难度和效果取决于加密算法的复杂性和安全性 JS加密的常见方法 压缩和混淆:将js代码的空格&a…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)HttpRequest模块 解析http请求协议

一、HTTP响应报文格式 HTTP/1.1 200 OK Bdpagetype: 1 Bdqid: 0xf3c9743300024ee4 Cache-Control: private Connection: keep-alive Content-Encoding: gzip Content-Type: text/html;charsetutf-8 Date: Fri, 26 Feb 2021 08:44:35 GMT Expires: Fri, 26 Feb 2021 08:44:35 GM…

Day27 回溯算法理论 77组合 216组合总和

回溯算法理论 回溯是一种效率并不高的穷举算法,因为用暴力算法都解决不了一些问题,所以才会考虑这个方法,它可以解决一系列问题: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规…

太平洋产险海南分公司:春季爱车保养,就看这几点!

一年之计在于春,春天不仅是万物复苏的好时节,也是一年中非常适合汽车养护的季节。 刚刚过去的春节,汽车的使用频率大大增加,很多车主都准备对爱车进行一次全面保养。加上立春过后,天气渐暖,许多车主也计划开…

提高iOS App开发效率的方法

引言 随着智能手机的普及,iOS App开发成为越来越受欢迎的技术领域之一。许多人选择开发iOS应用程序来满足市场需求,但是iOS App开发需要掌握一些关键技术和工具,以提高开发效率和质量。本文将介绍一些关键点,可以帮助你进行高效的…

基于SpringBoot的康复中心管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

Uncaught ReferenceError: videojs is not defined

项目场景: 项目背景: 开发 vue 项目时,调试时浏览器前端控制台 出现红色 报错信息: Uncaught ReferenceError: videojs is not defined 问题描述 遇到的问题: 开发 vue 项目时, 浏览器控制台出现如下所…

Vue-15、Vue条件渲染

1、v-show 在Vue中&#xff0c;v-show是一个指令&#xff0c;用于根据表达式的值来控制元素的显示与隐藏。当指令的值为true时&#xff0c;元素显示&#xff1b;当指令的值为false时&#xff0c;元素隐藏。 v-show的用法如下&#xff1a; <!DOCTYPE html> <html lan…

【REST2SQL】06 GO 跨包接口重构代码

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 对所有关系数据的操作都只有CRUD&#xff0c;采用Go 的接口interface{}重构代码…

黑群晖6.x 7.x ABB Active Backup for Business 套件激活方法

注意事项&#xff1a; 要先下载安装好Active Backup for Business套件再操作。SN码在【控制面板】 - 【信息中心】 -【产品序列号】。建议复制到记事本内修改内容。群晖的https是默认的5001端口&#xff0c;如果你的https端口号换过请自行修改&#xff1a;5001 为当前的端口号…

应用在热能表领域中的数字温度传感芯片

热能表&#xff0c;是适用于测量在热交换环路中&#xff0c;被称作载热液体的液体所吸收或转换热能的仪器&#xff0c;它由流量传感器、温度传感器和热能积算仪三部分组成。热量表&#xff08;热表&#xff09;又称热能表、热能积算仪&#xff0c;既能测量供热系统的供热量又能…

Zabbix6.0全套落地方案-基于RHEL9系列源码编译安装-Linux+Nginx+Mysql+Redis生产级模板Agent2客户端一键部署

实践说明&#xff1a;基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)&#xff0c;但适用场景不限于此&#xff0c;客户端一键部署安装包基于RHEL8和RHEL9。 文档形成时期&#xff1a;2023年 因系统或软件版本不同&#xff0c;构建部署可能略有差异&#xff0c;但本文未做细分…

便携式灯具的UL测试标准UL153介绍

UL153标准&#xff1a;UL153标准主要是描述有关使用电源线及插头作为连接工具,使用120伏电压,15或20安培的电源,并符合美国国家电器规范的便携灯.此标准也适用于那些不用插头,而用一些兼容的接线端作为连接工具的便携灯&#xff0c;同时对于使用非120伏电压&#xff0c;15or20安…