SQL进阶理论篇(十五):数据库的慢查询定位

文章目录

  • 简介
  • 数据库服务器的优化步骤
  • 使用慢查询
  • 使用explain
  • 使用show profile
  • 参考文献

简介

本节的主要内容如下:

  • 数据库服务器的优化分析步骤是怎样的?
  • 如何用慢查询日志查找执行慢的SQL语句?
  • 如何使用explain查看SQL执行计划?
  • 如何使用show profiling分析SQL执行步骤中的每一步的执行时间?

数据库服务器的优化步骤

教程里给出了这么一张图:

在这里插入图片描述

S1部分,需要观察服务器的状态是否是周期性的,比如说每个月固定几天慢,或者是每年固定几天慢这种。如果存在这种周期性的波动,那么可能是周期性业务节点的问题,比如说双十一等促销活动。这时候我们可以选择加缓存或者更改缓存失效策略来解决。

如果上一步并没有解决问题,或者是服务器的状态不是周期性的,那么进入S2这一步。

S2部分,需要开启慢查询,来帮助我们定位执行慢的SQL语句。其中,我们通过设置long_query_time这个参数来定义"慢"的阈值,如果 SQL的执行时间超过了这个阈值,就可以认为是慢查询,会被统一收集起来,做下一步分析。

S3部分,需要对执行慢的SQL语句做进一步分析。通过explain来查看对应的执行计划,通过show profile来查看每个步骤的时间成本。结合判断,查询慢是因为执行时间长,还是等待时间长。

如果是等待时间长,则进入A2步骤,调整服务器的参数,比如说适当扩大数据库缓冲池等。

如果是执行时间长,则进入A3步骤,考虑对SQL语句做优化(减少关联表等),或者对涉及到的表做优化(加索引)。

如果A2和A3都不能解决问题,那么可能是数据库自身的性能到瓶颈了,进入A4阶段,开始掏钱,看是否是需要增加服务器或者内存等,是否读写分离,是否分库分表等等。

以上就是数据库调优的完整流程思路,其实总结起来就是三个工具的使用:慢查询、explainshow profile

使用慢查询

慢查询,全称是慢查询日志,它可以帮助我们定位到执行慢的SQL。

使用前,我们需要查看慢查询是否已经开启:

mysql > show variables like '%slow_query_log';

在这里插入图片描述

OFF就是没开,可以通过以下方式打开:

mysql > set global slow_query_log='ON';

然后我们通过以下命令,查看慢查询日志文件的位置:

mysql > show variables like '%slow_query_log%';

在这里插入图片描述

慢查询里还有一个核心参数,即时间阈值参数,超过阈值的SQL查询才会被认为是慢查询,从而写进慢查询日志里。

可以使用下面命令来查看这个时间阈值参数:

mysql > show variables like '%long_query_time%';

在这里插入图片描述

默认情况下是10s,单位是秒。

可以通过下面命令进行修改:

mysql > set global long_query_time = 3;

即将时间修改为3s。

我们可以通过MySQL自带的mysqldumpslow这个工具来统计慢查询日志(是一个perl脚本,需要安装perl)。

只做下简单理解吧。

比如我们想要按照查询时间排序,查看前两条SQL语句,这样写即可:

perl mysqldumpslow.pl -s t -t 2 "慢查询日志路径"

-s t表示以查询时间来排序,-s支持多种排序参数,分别是 c(访问次数)、t(查询时间)、l(锁定时间)、r(返回记录)、ac(平均查询次数)、al(平均锁定时间)、ar(平均返回记录数)和 at(平均查询时间。

-t 2表示返回前两条数据。

了解即可。开启了慢查询日志,并设置了相应的慢查询时间阈值之后,只要查询时间大于这个阈值的 SQL 语句都会保存在慢查询日志中。

使用explain

之前其实也讲过,explain用来查看SQL的执行计划。

比如:

EXPLAIN SELECT comment_id, product_id, comment_text, product_comment.user_id, user_name FROM product_comment JOIN user on product_comment.user_id = user.user_id 

这里不再详述。

使用show profile

show profile可以进一步看到更详细的解析,包括SQL优化用了多久、统计用了多久、查询用了多久等。

查看profiling是否开启,默认是关闭OFF的:

mysql > show variables like 'profiling';

通过下面指令开启:

mysql > set profiling = 'ON';

查看当前会话下有哪些profiling:

mysql > show profiles;

在这里插入图片描述

可以看到当前会话一共有过两个查询,如果想查看最近一个查询的开销,可以使用:

mysql > show profile;

在这里插入图片描述

或者查看指定Query ID的开销,比如说查看ID为2的查询的消耗:

show profile for query 2;

或者查看详细信息:

show profile cpu,block io for query 2;

在这里插入图片描述

可以看到不同部分的开销,比如CPU、磁盘IO等。

我们可以根据每一部分的执行时间,来判断SQL到底慢在哪里。

不过,show profile在高版本中即将被弃用,我们现在也可以使用下面这种方式来代替:

select * from information_schema.profiling;

不过这种方式也需要提前将profiling打开,即执行set profiling = 'ON';

参考文献

  1. 33丨如何使用性能分析工具定位SQL执行慢的原因?

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

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

相关文章

MySQL数据库 视图

目录 视图概述 语法 检查选项 视图的更新 视图作用 案例 视图概述 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存…

DshanMCU-R128s2 RTOS 使用说明

使用串口访问设备 使用USB TypeC 连接线连接开发板 USB转串口 的接口,安装串口驱动程序:CH341SER.EXE 到设备管理器找到需要的串口,这里是 COM8 使用串口访问工具 PuTTY 打开串口,这里是 COM8,波特率 115200。 打开之后…

【redis笔记】

Redis简介 安装步骤 Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型: 字符串string ​ 哈希hash 适合存储对象 列表list 按照插入顺序排序,可以有重复元素 集合set 无序集合,没…

springboot学习笔记(五)

MybatisPlus进阶 1.MybatisPlus一对多查询 2.分页查询 1.MybatisPlus一对多查询 场景:我有一个表,里面填写的是用户的个人信息(姓名,生日,密码,用户ID)。我还有一个表填写的订单信息&#x…

Leetcode—445.两数相加II【中等】

2023每日刷题(六十七) Leetcode—445.两数相加II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2…

《Python》面试常问:深拷贝、浅拷贝、赋值之间的关系(附可变与不可变)【用图文讲清楚!】

背景 想必大家面试或者平时学习经常遇到问python的深拷贝、浅拷贝和赋值之间的区别了吧?看网上的文章很多写的比较抽象,小白接收的难度有点大,于是乎也想自己整个文章出来供参考 可变与不可变 讲深拷贝和浅拷贝之前想讲讲什么是可变数据类型…

OPC UA 与PROFINET比较

ROFINET和OPC UA是两种常见的协议,过去这两个协议有两个不同的角色。PROFINET通常用于现场设备和本地控制器之间的实时数据通信。而OPC UA通常用于在本地控制器和更高级别的MES和SCADA系统之间进行通信。 OPC UA 网络架构 PROFINET网络由IO控制器和IO设备组成&…

任天堂,steam游戏机通过type-c给VR投屏与PD快速充电的方案 三type-c口投屏转接器

游戏手柄这个概念,最早要追溯到二十年前玩FC游戏的时候,那时候超级玛丽成为了许多人童年里难忘的回忆,虽然长大了才知道超级玛丽是翻译错误,应该是任天堂的超级马里奥,不过这并不影响大家对他的喜爱。 当时FC家用机手柄…

Java小案例-Bean是如何注入到Spring中的,有几种注入方式

前言 关于Bean注入Spring容器的方式网上也有很多相关文章,但是很多文章可能会存在以下常见的问题 注入方式总结的不全 没有分析可以使用这些注入方式背后的原因 没有这些注入方式在源码中的应用示例 ... 所以本文就带着解决上述的问题的目的来重新梳理一下Bea…

安装gnvm,nodejs,npm使用方法

安装gnvm,nodejs,npm使用方法 一、安装gnvm gnvm.exe下载地址: https://download.csdn.net/download/hsg77/88651752 http://ksria.com/gnvm/#download 二、配置gnvm环境变量 新建目录,如:d:/nodejs 并把gnvm.exe存储到此目录 并把d:/node…

python 用OpenCV 将图片转视频

import os import cv2 import numpy as npcv2.VideoWriter()参数 cv2.VideoWriter() 是 OpenCV 中用于创建视频文件的类。它的参数如下: filename:保存视频的文件名。 fourcc:指定视频编解码器的 FourCC 代码&#xf…

【String str = new String(“hollis“) 创建了几个对象?】

✅典型解析 创建的对象数应该是1个或者2个。 首先要清楚什么是对象? Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的,在HotSpot虚机中,存储的形式就是oop-klass model,即ava对象模型。我们在Java代码中&am…