【MySQL高级】——性能分析

  数据库调优中,目标是 响应时间更快,吞吐量更大,利用宏观的监控工具和微观的日志分析帮助我们快速找到调优的思路和方式。

1. 数据库服务器优化步骤

  整个流程划分成了 观察(Show status) 和 行动(Action) 两个部分。字母 S 的部分代表观察(会使 用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。
在这里插入图片描述
在这里插入图片描述

2. 查看系统性能参数

  在MySQL中,可以使用 SHOW STATUS 语句查询一些MySQL数据库服务器的 性能参数 、 执行频率 。

SHOW [GLOBAL|SESSION] STATUS LIKE '参数';

一些常用的性能参数如下:

• Connections:连接MySQL服务器的次数。 
• Uptime:MySQL服务器的上线时间。 
• Slow_queries:慢查询的次数。 
• Innodb_rows_read:Select查询返回的行数 
• Innodb_rows_inserted:执行INSERT操作插入的行数 
• Innodb_rows_updated:执行UPDATE操作更新的行数 
• Innodb_rows_deleted:执行DELETE操作删除的行数 
• Com_select:查询操作的次数。 
• Com_insert:插入操作的次数。对于批量插入的 INSERT 操作,只累加一次。 
• Com_update:更新操作的次数。 
• Com_delete:删除操作的次数。

3. 统计SQL的查询成本:last_query_cost

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 定位执行慢的SQL:慢日志查询

<1> 概述

在这里插入图片描述

<2> 开启slow_query_log (global参数)

查看是否开启
show variables like ‘%low_query_log%’;
在这里插入图片描述
开启命令
set global slow_query_log=‘ON’;
在这里插入图片描述

<3> 修改long_query_time阈值(global&session参数)

1. 查看阈值

查看当前session

show variables like '%long_query_time%';

在这里插入图片描述
查看全局

show global variables like '%long_query_time%';

在这里插入图片描述

2. 设置阈值命令

全局设置

set global long_query_time = 1;

当前session

set long_query_time = 1;

3. min_examined_row_limit

在这里插入图片描述

<4> 查看慢查询数目

执行一个耗时sql

select student_id,create_time, count(*) from student_info GROUP BY student_id ,create_time;
SHOW GLOBAL STATUS LIKE '%Slow_queries%';

<5> 读取慢查询日志文件

执行一个耗时sql

select student_id,create_time, count(*) from student_info GROUP BY student_id ,create_time;

在这里插入图片描述

<6> 慢查询日志分析工具:mysqldumpslow

在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具 mysqldumpslow 。

1. 语法

在这里插入图片描述
mysqldumpslow 命令的具体参数如下:

-a: 不将数字抽象成N,字符串抽象成S
-s: 是表示按照何种方式排序:
    c: 访问次数
    l: 锁定时间
    r: 返回记录
    t: 查询时间
    al:平均锁定时间
    ar:平均返回记录数
    at:平均查询时间 (默认方式)
    ac:平均查询次数
-t: 即为返回前面多少条的数据;
-g: 后边搭配一个正则匹配模式,大小写不敏感的;

2. 案例

<1>按照查询时间排序,查看前五条 SQL 语句

mysqldumpslow -s t -t 5 /var/lib/mysql/mysql202-slow.log

在这里插入图片描述
<2> 得到返回记录集最多的10个SQL

mysqldumpslow -s r -t 10 /var/lib/mysql/mysql202-slow.log

<3> 得到访问次数最多的10个SQL

mysqldumpslow -s c -t 10 /var/lib/mysql/mysql202-slow.log

<4> 得到按照时间排序的前10条里面含有左连接的查询语句

mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/mysql202-slow.log

<5> 另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况

mysqldumpslow -s r -t 10 /var/lib/mysql/mysql202-slow.log | more

<7> 关闭慢查询日志

1. 配置文件(永久性)

设置为OFF

[mysqld] 
slow_query_log=OFF

或直接删除或注释

[mysqld] 
#slow_query_log =OFF

2. 命令方式(临时性)

SET GLOBAL slow_query_log=off;

<8> 删除慢查询日志

  1. 查询文件位置,然后去文件目录中删除或备份即可
  2. 重新生成日志文件:mysqladmin -uroot -p flush-logs slow

5. 查看SQL执行成本:profiler(global&session参数)

<1> 查看状态

全局设置

show global variables like 'profiling';

在这里插入图片描述
当前session

show variables like 'profiling';

<2> 开启关闭

全局设置

set global profiling = 'ON';

当前session

set profiling = 'ON';

<3> 查看sql列表

show profiles;

在这里插入图片描述

<4> 查看最近一个sql详细内容

show profile;

在这里插入图片描述

<5> 查看指定请求详细内容

show profile for query 2;

在这里插入图片描述

<6> 常用查询参数

  1. ALL:显示所有的开销信息。
  2. BLOCK IO:显示块IO开销。
  3. CONTEXT SWITCHES:上下文切换开销。
  4. CPU:显示CPU开销信息。
  5. IPC:显示发送和接收开销信息。
  6. MEMORY:显示内存开销信息。
  7. PAGE FAULTS:显示页面错误开销信息。
  8. SOURCE:显示和Source_function,Source_file,Source_line相关的开销信息。
  9. SWAPS:显示交换次数开销信息。
    在这里插入图片描述

<7> 注意

在这里插入图片描述

6. 分析查询语句:EXPLAIN

<1> 概述

1. 简介

在这里插入图片描述

2. 作用

在这里插入图片描述

3. 版本情况

在这里插入图片描述

<2> 基本语法

  1. 语法
EXPLAIN SELECT select_options 

或者

DESCRIBE SELECT select_options
  1. 案例
EXPLAIN SELECT 1;

<3> 数据准备

依次执行

CREATE TABLE s1 (
id INT AUTO_INCREMENT,
key1 VARCHAR(100),
key2 INT,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
INDEX idx_key1 (key1),
UNIQUE INDEX idx_key2 (key2),
INDEX idx_key3 (key3),
INDEX idx_key_part(key_part1, key_part2, key_part3)
) ENGINE=INNODB CHARSET=utf8;

CREATE TABLE s2 (
id INT AUTO_INCREMENT,
key1 VARCHAR(100),
key2 INT,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
INDEX idx_key1 (key1),
UNIQUE INDEX idx_key2 (key2),
INDEX idx_key3 (key3),
INDEX idx_key_part(key_part1, key_part2, key_part3)
) ENGINE=INNODB CHARSET=utf8;

set global log_bin_trust_function_creators=1;

DELIMITER //
CREATE FUNCTION rand_string1(n INT)
RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
SET i = i + 1;
END WHILE;
RETURN return_str;
END //
DELIMITER ;

DELIMITER //
CREATE PROCEDURE insert_s1 (IN min_num INT (10),IN max_num INT (10))
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i + 1;
INSERT INTO s1 VALUES(
(min_num + i),
rand_string1(6),
(min_num + 30 * i + 5),
rand_string1(6),
rand_string1(10),
rand_string1(5),
rand_string1(10),
rand_string1(10));
UNTIL i = max_num
END REPEAT;
COMMIT;
END //
DELIMITER ;

DELIMITER //
CREATE PROCEDURE insert_s2 (IN min_num INT (10),IN max_num INT (10))
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i + 1;
INSERT INTO s2 VALUES(
(min_num + i),
rand_string1(6),
(min_num + 30 * i + 5),
rand_string1(6),
rand_string1(10),
rand_string1(5),
rand_string1(10),
rand_string1(10));
UNTIL i = max_num
END REPEAT;
COMMIT;
END //
DELIMITER ;

CALL insert_s1(10001,10000);

CALL insert_s2(10001,10000);

<4> EXPLAIN 输出列详解

在这里插入图片描述

1. table

在这里插入图片描述
在这里插入图片描述

2. id

在这里插入图片描述

同一组中,排在上边的就做驱动表,后边的叫做 被驱动表

在这里插入图片描述

3. select_type

在这里插入图片描述

在这里插入图片描述

<1> SIMPLE

查询语句中不包含UNION或者子查询的查询都算作是SIMPLE类型
连接查询也算是SIMPLE类型

<2> PRIMARY

对于包含UNION或者UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY

<3> UNION

对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的select_type值就是UNION

<4> UNION RESULT

MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type就是UNION RESULT
在这里插入图片描述
在这里插入图片描述

<5> SUBQUERY

如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是不相关子查询。该子查询的第一个SELECT关键字代表的那个查询的select_type就是SUBQUERY

<6> DEPENDENT SUBQUERY

如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是相关子查询,则该子查询的第一个SELECT关键字代表的那个查询的select_type就是DEPENDENT SUBQUERY , select_type为DEPENDENT SUBQUERY的查询可能会被执行多次。
在这里插入图片描述
在这里插入图片描述

<7> DEPENDENT UNION

在包含UNION或者UNION ALL的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的select_type的值就是DEPENDENT UNION

在这里插入图片描述
在这里插入图片描述

<8> DERIVED

对于包含派生表的查询,该派生表对应的子查询的select_type就是DERIVED

在这里插入图片描述

在这里插入图片描述

<9> MATERIALIZED

当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,该子查询对应的select_type属性就是MATERIALIZED

在这里插入图片描述
在这里插入图片描述

4. partitions

在这里插入图片描述

5. type

在这里插入图片描述
在这里插入图片描述

<1> system

当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system
在这里插入图片描述

<2> const

当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const

在这里插入图片描述

<3> eq_ref

在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是eq_ref

在这里插入图片描述

<4> ref

当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref
在这里插入图片描述

<5> ref_or_null

当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_null
在这里插入图片描述

<6> index_merge

单表访问方法时在某些场景下可以使用IntersectionUnionSort-Union这三种索引合并的方式来执行查询

在这里插入图片描述

<7> unique_subquery

unique_subquery是针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询转换为EXISTS子查询,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type列的值就是unique_subquery

在这里插入图片描述

<8> range

如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法
在这里插入图片描述

<9> index

当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index

在这里插入图片描述

<10>all

全表扫描

6. possible_keys 和key

在这里插入图片描述

7. key_len

实际使用到的索引长度(即:字节数),帮助检查是否充分利用上了索引,值越大越好,主要针对于联合索引,有一定参考意义。

<1> key_len的长度计算公式
  1. varchar(10)变长字段且允许NULL
    10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)
  2. varchar(10)变长字段且不允许NULL
    10 * ( character set:utf8=3,gbk=2,latin1=1)+2(变长字段)
  3. char(10)固定字段且允许NULL
    10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)
  4. char(10)固定字段且不允许NULL
    10 * ( character set:utf8=3,gbk=2,latin1=1)

8. ref

当使用索引列等值查询时,与索引列进行等值匹配的对象信息。比如只是一个常数或者是某个列。

9. rows

预估的需要读取的记录条数 ,值越小越好

10. filtered

某个表经过搜索条件过滤后剩余记录条数的百分比如果使用的是索引执行的单表扫描,那么计算时需要估计出满足除使用到对应索引的搜索条件外的其他搜索条件的记录有多少条。

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

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

相关文章

记一次 .NET某收银软件 非托管泄露分析

一&#xff1a;背景 1. 讲故事 在我的分析之旅中&#xff0c;遇到过很多程序的故障和杀毒软件扯上了关系&#xff0c;有杀毒软件导致的程序卡死&#xff0c;有杀毒软件导致的程序崩溃&#xff0c;这一篇又出现了一个杀毒软件导致的程序非托管内存泄露&#xff0c;真的是分析多…

远程如何才能完整快速的传输大文件?

随着互联网技术的迅速进步&#xff0c;远程文件传输已经成为企业间合作与交流中不可或缺的一环。然而&#xff0c;在需要传输大文件的情况下&#xff0c;传统的文件传输方式往往会面临传输速度慢、文件易损等问题。因此&#xff0c;如何实现远程大文件的快速、安全、完整传输&a…

iOS UI掉帧和卡顿优化解决方案记录

UI卡顿原理 在 VSync 信号到来后&#xff0c;系统图形服务会通过 CADisplayLink 等机制通知 App&#xff0c;App 主线程开始在 CPU 中计算显示内容&#xff0c;比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去&#xff0c;由 GPU 进行…

教你用通义千问只要五步让千年的兵马俑跳上现代的科目三?

教你用五步让千年的兵马俑跳上现代的舞蹈科目三&#xff1f; 上面这个“科目三”的视频&#xff0c;只用了一张我上月去西安拍的兵马俑照片生成的。 使用通义千问&#xff0c;只要5步就能它舞动起来&#xff0c;跳上现在流行的“科目三”舞蹈。 全民舞王 第1步 打开通义千问…

设计师们必备的神秘利器!这款设计工具不容忽视!

「即时设计」与Figma类似&#xff0c;它是一种云设计工具&#xff0c;可以与多人实时合作&#xff0c;从设计到评估、交付、团队合作和版本管理。 作为一种国内工具&#xff0c;起初我们对它不是很乐观&#xff0c;但不得不说&#xff0c;经过深入使用&#xff0c;无论是迭代速…

【量化交易实战记】小明的破晓时刻——2023下半年新能源汽车板块的成功掘金之旅

在2023年的炎炎夏日&#xff0c;小明在不断的观察分析市场的过程中&#xff0c;突然敏锐地察觉到了新能源汽车市场的风云变幻。他日复一日地研读行业报告、追踪政策动向、分析公司财报&#xff0c;以及密切关注全球市场动态。那段时间里&#xff0c;新能源汽车行业仿佛迎来了一…

C++ 有需求 需要对数字向下取整 int和 double 混淆 已解决

在项目使用中。 原本以为 直接 ceil(13/ 2) 3 但是实际是错误的。 需要 是 ceil(5.0 / 2) double 才能向上取整。结果有大佬 直接使用两种办法 能解决问题。 由于传入的参数和返回的参数都是double&#xff0c;所以需要手动转化 #include <bits/stdc.h> using name…

Docker部署的gitlab升级指南(15.11.X容器里升级PostgreSQL到13.8)

一、确定当前版本 #进入当前版本容器产看gitlab版本 docker exec -it gitlab cat /opt/gitlab/embedded/service/gitlab-rails/VERSION#显示版本如下 14.4.0二、备份数据&#xff0c;防止升级发生意外 #执行备份命令 docker exec -ti gitlab gitlab-rake gitlab:backup:creat…

Mybatis基础---------增删查改

增删改 1、新建工具类用来获取会话对象 import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.io.Resources;import java.io.IOExcept…

Spring环境搭配

概述 Spring 是一个开源框架&#xff0c;Spring 是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由 RodJohnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是 为了解决企业应用开发的复杂性而创建的。框架的主要优势…

【PDF密码】PDF密码,如何强制取消?

想要给PDF文件设置一个密码防止他人对文件进行编辑&#xff0c;那么我们可以对PDF文件设置限制编辑&#xff0c;设置方法很简单&#xff0c;我们在PDF编辑器中点击文件 – 属性 – 安全&#xff0c;在权限下拉框中选中【密码保护】 然后在密码保护界面中&#xff0c;我们勾选【…

一台电脑如何通过另一台联网电脑访问网络

电脑A没有连接网络&#xff0c;电脑B已经连接wifi。 电脑A如何通过访问电脑B从而连接网络&#xff1f; 1. 将这2台电脑用网线直连 2. 电脑B打开【网络和Internet设置】 3. 右键点击WLAN&#xff0c;选择属性&#xff0c;进入共享tab页面&#xff0c;勾选【允许其他网络用户通过…

统计学-R语言-4.7

文章目录 前言描述水平的统计量平均数分位数中位数四分位数 众数描述差异的统计量&#xff08;数据离散程度&#xff09;极差四分位差方差和标准差变异系数标准分数 描述分布形状的统计量偏度与偏度系数峰度与峰度系数 数据的综合描述综合描述的R函数综合描述的实例 总结 前言 …

Linux安装Rdkafka PHP 扩展(Kafka使用教程)

以是centos为例 #可以查看php版本 php -v#查看php安装的扩展库 php -m 1、首先&#xff0c;确保你已经安装了 PHP 和相关的开发工具。你可以使用以下命令来安装它们&#xff1a; sudo yum install php-devel 中间会问你是否ok&#xff0c;输入y回车&#xff0c;出现complete…

【总结】浅谈深度学习算法与硬件协同优化

写在前面 本文总结了笔者本科期间关于深度神经网络算法与硬件协同优化的思路和常用方法&#xff0c;希望能够给入门此方向的同学带来一定的启发。笔者学疏才浅&#xff0c;如有问题欢迎私信或评论区讨论交流&#xff01; 一、背景与意义 深度神经网络(Deep Neural Network, …

从理论到实践:数字孪生技术的全面应用探讨

数字孪生是一种将实际物体或系统的数字模型与其实时运行状态相结合的概念。这一概念的核心在于创建一个虚拟的、与真实世界相对应的数字副本&#xff0c;以便监测、分析和优化实体系统的性能。 简单理解&#xff0c;数字孪生就是在一个设备或系统的基础上&#xff0c;创造一个…

快速入门Torch读取自定义图像数据集

真有用读取自定义数据集 学习新技术当然首先要看官网了就这&#xff1f;&#xff1f;&#xff1f;官方提供了许多内置好的数据集&#xff0c;但是我需要自定义啊&#xff01;&#xff01;&#xff01;我是谁&#xff1f;我在哪&#xff1f;我在干什么&#xff1f;完全不知道如何…

FFMPEG命令生成各国国旗

文章目录 亚洲篇中国~待补充朝鲜~待补充韩国~待补充蒙古~待补充日本越南~待补充老挝 欧洲篇挪威~待补充瑞典~待补充芬兰~待补充冰岛~待补充丹麦~待补充爱沙尼亚拉脱维亚立陶宛白俄罗斯~待补充乌克兰摩尔多瓦~待补充俄罗斯德国 亚洲篇 中国~待补充 朝鲜~待补充 韩国~待补充 …

Ubuntu 20.04扩容磁盘命令:Ubuntu 20.04扩容系统主分区教程(PV VG LV)

前置知识&#xff1a; 磁盘 最基础的存在&#xff0c;物理磁盘 pv 物理卷&#xff08;同一磁盘 可以划分多个物理卷&#xff09; vg 卷组 &#xff08;一个到多个pv可组成一个卷组&#xff09; lv 逻辑卷 &#xff08;卷组可以划分为多个逻辑卷&#xff09;Ubuntu20.4扩容磁…