你竟然还不知道SQL性能分析?(你想象不到的详细)

 🎉欢迎您来到我的MySQL基础复习专栏

☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
✨博客主页:小小恶斯法克的博客
🎈该系列文章专栏:重拾MySQL-进阶篇
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 感谢大家的关注! ❤️

目录

🚀SQL性能分析

🚀慢查询日志

🚀profile详情

🚀explain

🚀Explain 执行计划中各个字段的含义 :


🚀SQL性能分

主要优化的是查询语句 

SQL执行频率 (就是用来判定当前数据库是以查询为主,还是修改,插入为主,再去看看需不需要优化

MySQL 客户端连接成功后,通过  show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的insert,update,delete,select的访问频次,从而判断当前数据库查询为主,还是增删改为主

-- session 是查看当前会话 ;

-- global 是查询全局数据 ; 

SHOW  GLOBAL STATUS LIKE  'Com_______ ';

在第一次查看完访问频次之后,我再去使用语句,进行了3次查询

select * from tb_user ;

此时我再次执行 

SHOW  GLOBAL STATUS LIKE  'Com_______';

结果如下:

所以通过这条指令我们就知道,当前数据库是插入为主还是查询为主   

Com_delete: 删除次数

Com_insert: 插入次数

Com_select: 查询次数

Com_update: 更新次数

我们可以在当前数据库再执行几次查询操然后再次查看执行频次,看看  Com_select 参数会不会变化

通过上述指令我们可以查看到当前数据库到底是以查询为主还是以增删改为主从而为数据库优化提供参考依据。如果是以增删改为主,我们可以考虑不对其进行索引的优化。如果是以查询为主,那么就要考虑对数据库的索引进行优化了。

✨思考:为什么增删改为主就不考虑对索引的优化,而查询为主,就考虑对索引的优化呢?

✨因为当数据库操作以增、删、改为主时,通常意味着频繁地对数据库进行写入操作。在这种情况下,如果对数据库表进行频繁的更新,插入或删除操作,添加索引可能会导致一些额外的开销。这是因为每次进行写操作时,数据库都需要更新索引结构,从而增加了系统的负担和消耗。因此,针对这种场景,我们可以考虑不对其进行索引的优化。

相反,如果数据库操作主要是以查询为主,那么对数据库的索引进行优化就变得至关重要。通过对经常被查询的列进行索引,可以大大提高查询的效率。索引引能够帮助数据库引擎快速定位到符合查询条件的数据行,从而减少了扫描整个表的开销,提升了查询性能。特别是在大型数据集上,索引的作用更加显著,因为它可以大幅减少查询所需的时间。

综上所述,根据数据库操作的主要类型,我们需要权衡是否对数据库进行索引优化。在写入操作频繁的情况下,可以考虑不进行索引优化以降低额外的开销;而在查询操作频繁的情况下,则需要考虑对数据库的索引进行优化,以提升查询效率。

 那假如说是以查询为主,我们又该如何定位针对于那些查询语句进行优化呢?

次数我们可以借助于慢查询日志。

🚀慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time单位默认10的所有 SQL语句的日志。(来定位哪些sql语句执行效率比较低,从而来对这类sql语句进行优化)

MySQL的慢查询日志默认没有开启我们可以查看一下系统变量  slow_query_log ;

在MySQL中,您可以通过以下语法查看系统变量 slow_query_log 的状态:

SHOW VARIABLES LIKE 'slow_query_log';

这条SQL语句将显示名为 slow_query_log 的系统变量的当前状态。

执行: 

 

 

✨要配置MySQL以记录慢查询日志,您可以按照以下步骤进行操作:

  1. 编辑MySQL配置文件:打开MySQL的配置文件,通常是(/etc/my.cnf)或my.ini,具体位置取决于您的操作系统和安装方式。

  2. 启用慢查询日志:找到配置文件中与慢查询日志相关的部分,如果不存在以下行,请添加。如果存在,请确保参数的值符合您的需求:

    slow_query_log = 1
    

    这将启用慢查询日志,并开始记录慢查询。

  3. 指定慢查询阈值(可选):您可以设置一个阈值,告诉MySQL记录超过该执行时间的查询。默认情况下,慢查询日志记录超过10秒的查询。您可以通过以下配置来更改这个阈值:

    long_query_time = 2
    

    在上面的示例中,我们将慢查询的阈值设置为2秒,这意味着执行时间超过2秒的查询将被记录在慢查询日志中。

  4. 指定慢查询日志文件路径(可选):您也可以指定慢查询日志文件的路径。如果您不指定路径,MySQL将使用默认路径。

    slow_query_log_file = /path/to/your/log/file.log
    

    请将/path/to/your/log/file.log替换为您希望存储慢查询日志的实际路径。

  5. 重启MySQL服务器:保存并关闭配置文件,然后重新启动MySQL服务器,以使更改生效。

  6. 验证配置:您可以使用以下命令检查慢查询日志是否已经启用:

    SHOW VARIABLES LIKE 'slow_query_log';
    

    如果返回值为on或1,表示慢查询日志已经成功启用。

一旦完成上述步骤,MySQL就会开始记录满足条件的查询到指定的慢查询日志文件中。

配置完毕之后通过以下指令重新启动MySQL服务器进行测试查看慢日志文件中记录的信息 /var/lib/mysql/localhost-slow.log

systemctl restart MySQL ;

然后,再次查看开关情况慢查询日志就已经打开了

 测试:(此测试内容与图片来源于黑马)

执行如下SQL语句 

select * from tb_user; -- 这条SQL执行效率比较高, 执行耗时 0.00sec
select count (*) from tb_sku; -- 由于tb_sku表中, 预先存入了1000w的记录, count一次,耗时
13.35sec

检查慢查询日志

最终我们发现在慢查询日志中只会记录执行时间超多我们预设时间(2sSQL执行较快的SQL 是不会记录的。

那这样通过慢查询日志就可以定位出执行效率比较低的SQL从而有针对性的进行优化 

🚀profile详情

show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了通过have_profiling 参数,能够看到当前MySQL是否支持profile操作

SELECT  @@have_profiling ;

可以看出MySQL支持profile

但是开关是关闭的,可以通过set语句在session/globla级别开启profiling

SET  profiling = 1;

此时开关已经打开了,接下来,我们所执行的SQL语句,都会被MySQL记录,并记录执行时间消耗到哪里去了

 执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时

-- 查看每一条SQL的耗时基本情况
show profiles;-- 查看指定query_id的SQL语句各个阶段的耗时情况
show profile  for  query query_id;-- 查看指定query_id的SQL语句CPU的使用情况
show profile  cpu for  query query_id;

🚀explain

EXPLAIN或者DESC命令获取 MySQL如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序

语法

-- 直接在select语句之前加上关键字 explain / desc
explain select 字段列表 from 表名 where 条件;

执行 

🚀Explain 执行计划中各个字段的含义 :

id

select查询的序列号,表示查询中执行select子句或者是操作表的顺序 (id相同,执行顺序从上到下;  id不同,值越大,越先执行)

select_type

表示  SELECT 的类型常见的取值有  SIMPLE (简单表即不使用表连接

或者子查询)、  PRIMARY (主查询,即外层的查询)、

UNION UNION 中的第二个或者后面的查询语句)、

SUBQUERY SELECT/WHERE之后包含了子查询)等

type

表示连接类型,性能由好到差的连接类型为NULL  system  const

eq_ref  ref  range    index  all

possible_key

显示可能应用在这张表上的索引一个或多个

key

实际使用的索引如果为NULL则没有使用索

key_len

表示索引中使用的字节数,    该值为索引字段最大可能长度并非实际使用长 度,在不损失精确性的前提下,    长度越短越好  。

rows

MySQL认为必须要执行查询的行数,在innodb引擎的表中是一个估计值 可能并不总是准确的。

filtered

表示返回结果的行数占需读取行数的百分比,    filtered 的值越大越好.

 


本篇到这里结束啦,希望对你有帮助!

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

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

相关文章

外呼机器人有什么优势?

外呼机器人有什么优势?值得受到大多数电销企业的追捧! 1、电话外呼效率高: 每天可拨打的电话数量是人工的5-10倍,人工一天只能拨打200-300通电话,机器人每天能打3000通电话以上,无须休息,按照…

139基于matlab多旅行商MTSP问题

基于matlab多旅行商MTSP问题,利用遗传算法求解多旅行商问题的算法设计,输出MTSP路径。相互独立路径,同一起点路径。程序已调通,可直接运行。 139 matlab多旅行熵M-TSP (xiaohongshu.com)https://www.xiaohongshu.com/explore/65ab…

云原生场景下,AIGC 模型服务的工程挑战和应对

作者:徐之浩、车漾 “成本”、“性能”和 “效率”正在成为影响大模型生产和应用的三个核心因素,也是企业基础设施在面临生产、使用大模型时的全新挑战。AI 领域的快速发展不仅需要算法的突破,也需要工程的创新。 大模型推理对基础设施带来…

为vs code配置unity开发环境

1.安装.NET.Core SDK 我们可以访问官网下载安装SDK及tool(https://www.microsoft.com/net/download/core)下载。有的系统只提供了执行文件,没有提供安装包,需要自己做一些配置。 下载好对应的版本就可以安装了,安装好以…

九、Qt C++ 数据库开发

《一、QT的前世今生》 《二、QT下载、安装及问题解决(windows系统)》《三、Qt Creator使用》 ​​​ 《四、Qt 的第一个demo-CSDN博客》 《五、带登录窗体的demo》 《六、新建窗体时,几种窗体的区别》 《七、Qt 信号和槽》 《八、Qt C 毕业设计》 《九、Qt …

递归、搜索与回溯算法(专题二:深搜)

往期文章(希望小伙伴们在看这篇文章之前,看一下往期文章) (1)递归、搜索与回溯算法(专题零:解释回溯算法中涉及到的名词)【回溯算法入门必看】-CSDN博客 (2&#xff09…

TDengine 创始人陶建辉在汽车 CIOCDO 论坛发表演讲,助力车企数字化转型

当前,汽车行业的数字化转型如火如荼。借助数字技术的充分利用,越来越多的车企进一步提升了成本优化、应用敏捷性、高度弹性和效率。这一转型使得业务应用的开发和管理模式发生了颠覆性的创新,赋予了汽车软件快速响应变化和动态调度资源的能力…

54.螺旋矩阵(js)

题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 思路: 先实现方向控制…

AI日报:扎克伯格瞄准AGI通用人工智能

文章目录 Meta瞄准通用人工智能领域Meta的目标Meta的产品 FAIR移动和装载H100扎克伯格对人工智能竞争对手的真实动机持怀疑态度Meta抛弃了元宇宙吗? Meta瞄准通用人工智能领域 Meta首席执行官马克扎克伯格(Mark Zuckerberg)在一份可能改变全…

Pycharm Terminal 无法激活conda环境

1.问题 Failed to activate conda environment. Please open Anaconda prompt, and run conda init powershell there. 这导致我们无法在Pycharm中使用conda命令 2.解决办法 修改为第二个,然后重启Terminal 再打开时发现已经是当前的conda环境

如何优化SQL查询性能?解开你的数据库瓶颈之谜!

目录 1、前言 2、创建索引 2.1 确保表的主键和外键都有索引 2.2 根据查询条件创建适当的索引 2.3 避免在索引列上进行类型转换或函数操作 3、合理设计数据库架构 3.1 表的拆分和归并,避免不必要的数据冗余 3.2 使用适当的数据类型和字段长度&#xff0…

linux的PXE服务(进阶知识)

一、批量部署概述 什么是PXE 预启动执行环境(PXE)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中&am…

ros2仿真学习04 -turtlebot3实现cartographer算法建图演示

安装看这里 https://blog.csdn.net/hai411741962/article/details/135619608?spm1001.2014.3001.5502 虚拟机配置: 内存16g cpu 4 核 磁盘40G,20G 不够 启动仿真 ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py启动成功如下 启动建图 重新开一个…

softmax回归

softmax回归 我们从一个图像分类问题开始。 假设每次输入是一个22的灰度图像。 我们可以用一个标量表示每个像素值,每个图像对应四个特征x1,x2,x3,x4。 此外,假设每个图像属于类别“猫”“鸡”和“狗”中的一个。 但是一般的分类问题并不与类别之间的自…

使用CSS计算高度铺满屏幕

前言 今天写项目时出现高度设置百分百却不占满屏幕,第一反应看自己设置的是块级元素还是行级元素。看了几篇博客,发现并不能解决问题。脱离文档流的做法都没考虑,前期模板搭建脱离文档流,后面开发会出现很多问题。 以上图片是我…

UE中使用Niagara粒子构建空间网格类特效

空间网格是一种比较常见的效果,基于这个基础表现可以在此之上做许多扩展。 最终呈现如下: 1.初始配置 首先通过网格发射器构建网格阵列,以Fountain自带发射器为模板,删除一些节点: 随后将发射器更改为Grid阵列发射…

适用于 Windows 电脑的 10 个最佳免费数据恢复软件

数据已成为数字世界运行的主要来源。任何数据丢失都会对公司的日常活动产生巨大影响。它影响过程的连续性。下面的文章为您带来了各种简单且免费使用的数据恢复软件。 什么是数据恢复? 检索和恢复丢失、损坏、无法访问、损坏或意外删除的数据的过程称为数据恢复。这…

unity-声音与声效OLD

声音与声效 基本概念audio clipaudio listeneraudio source 基本操作如何创建音频源(背景音乐)如何在测试的时候关闭声音 常用代码一般流程如何在一个物体上播放多个音效如何在代码中延时播放多个声音如何在代码中停止音频的播放如何判断当前是否在播放音…

【JavaEE Spring】SpringBoot 日志

SpringBoot 日志 1. 日志概述2. 日志使用2.1 打印⽇志2.1.1 在程序中得到⽇志对象2.1.2 使⽤⽇志对象打印⽇志 2.2 ⽇志框架介绍2.2.1 ⻔⾯模式(外观模式)2.2.2 SLF4J 框架介绍 2.3 ⽇志格式的说明2.4 ⽇志级别2.4.1 ⽇志级别的分类2.4.2 ⽇志级别的使⽤ 2.5 ⽇志配置2.5.1 配置…

微信小程序(七)navigator点击效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.默认效果 2.无效果 3.激活效果 源码&#xff1a; index.wxml //如果 <navigator url"/pages/logs/logs">跳转到log页面&#xff08;默认&#xff09; </navigator><navigator url&q…