【MySQL高级】——性能分析

news2025/1/10 16:59:45

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

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

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

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

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

相关文章

业财融合:解密企业管理的黄金钥匙

本文提炼总结自专刊《上市公司如何打好合规与增长的双赢之战》。全书40页&#xff0c;出品方纷享销客市场部。如有需要&#xff0c;请阅读原版电子书&#xff1a;《上市公司如何打好合规与增长的双赢之战》 目 录 一、什么是业财融合&#xff1f; 二、财务部门面临的挑战…

超好用的写作软件,下面这5款AI写作你一定要知道

写作是一项需要耐心和技巧的工作&#xff0c;而在数字化时代&#xff0c;我们可以借助各种写作软件来提高效率和质量。在市场上有许多AI自动写作软件&#xff0c;它们能够帮助我们生成文章、提供创意和编辑建议。在本文中&#xff0c;我将向大家推荐五款功能强大且好用的写作软…

腾讯云把向量数据库“卷”到哪一步了?

“不是我不明白&#xff0c;这世界变化快”&#xff0c;崔健在20世纪写下的这句歌词&#xff0c;放在刚刚过去的2023年&#xff0c;也同样适用。技术风向的变化之快&#xff0c;让不少人感到惊讶&#xff0c;向量数据库这一年的潮起潮落&#xff0c;就是一个典型的例子。 2023年…

记edusrc一处信息泄露

一、信息收集 在搜索某一学校的资产时&#xff0c;找到了一处学工系统。 登录进去&#xff0c;发现有两种登陆方式&#xff0c;一种是统一身份认证&#xff0c;一种是DB认证。 统一身份认证是需要通过学生的学号和密码进行登录的&#xff0c;利用谷歌语法可以搜索到相关学…

网络安全的威胁PPT

建议的PPT免费模板网站&#xff1a;http://www.51pptmoban.com/ppt/ 此PPT模板下载地址&#xff1a;https://file.51pptmoban.com/d/file/2023/03/20/1ae84aa8a9b666d2103f19be20249b38.zip 内容截图&#xff1a;

Python简单ORM实现:不使用元类的灵活数据操作与查询构建【第29篇—python:ORM】

文章目录 不使用元类的简单ORM实现Field类Compare类Model类Query类示例使用扩展查询功能支持 LIMIT 和 OFFSET支持 GROUP BY 和 HAVING 示例用法总结 不使用元类的简单ORM实现 在 Python 中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff09;是一种将对象和数…

什么是泛域名证书?有免费的吗?

泛域名证书&#xff08;Wildcard SSL Certificate&#xff09;是一种用于加密多个子域名的SSL证书。与传统的SSL证书只能覆盖单个域名或特定子域不同&#xff0c;泛域名证书具有更广泛的适用性&#xff0c;可以涵盖一个域名下的所有子域。 泛域名证书的主要特点是通配符&#x…

华为数通方向HCIP-DataCom H12-831题库(判断题:1-20)

第01题 为了加快IS-IS网络中链路故障的感知速度,可以将IS-IS与BFD联动 正确 错误 答案:正确 解析: OSPF和IS-IS都可以设置与BFD联动加速链路故障检测 ,使用BFD时,可以实现毫秒级别的链路切换,所以使用IS–IS与BFD联动,可以加快IS–IS的感知速度 第02题 在OSPF中ABR会将…

引入企业社区打造员工互动环境

作为一家富有活力和创新精神的企业&#xff0c;应始终致力于提供一个积极、紧密和互动的工作环境&#xff0c;以促进员工之间的合作与讨论。引入企业社区&#xff0c;打造了一个集积分商城、互动板块和意见箱等功能于一体的社区空间&#xff0c;旨在进一步加强企业内部的沟通与…

【Linux】各目录说明

【常见目录说明】 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在这里。 /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录&#xff0c;是用户主目录的基点&#xff0c;比如用户user的主目录就是/home/user&#xff0c;可以…

【css】渐变效果

css渐变效果 使用 CSS 渐变可以在两种颜色间制造出平滑的渐变效果。 用它代替图片&#xff0c;可以加快页面的载入时间、减小带宽占用。同时&#xff0c;因为渐变是由浏览器直接生成的&#xff0c;它在页面缩放时的效果比图片更好&#xff0c;因此你可以更加灵活、便捷的调整页…

Google的Ndk-Sample学习笔记之一(hello-jniCallback)

前言: 近段时间因为项目的需求,需要使用JNI,所以下载了Google的Ndk-Sample学习下,准备记录 下来,留给后期自己查看 问题点一:JNI_OnLoad方法必须返回JNI的版本 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {JNIEnv *env;memset(&g_ctx, 0, sizeof(g_…

鸿蒙开发笔记(五):状态管理,组件状态管理 @State @Prop @Link

如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也…

斯坦福 Stats60:21 世纪的统计学:第十五章到第十八章

第十五章&#xff1a;比较均值 原文&#xff1a;statsthinking21.github.io/statsthinking21-core-site/comparing-means.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 我们已经遇到了许多情况&#xff0c;我们想要询问样本均值的问题。在本章中&#xff0c;我们…

当前vscode环境下 多进程多线程运行情况探究

我的代码 其中在“打开图片时”、“进入子进程之前”、“子进程join前”、“进入子进程区域后”&#xff0c;“子进程join后”、“进入子线程区域后”分别打印了进程线程的编号和数量。 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file test2.…

嵌入式-Stm32-江科大基于标准库的GPIO通用输入输出口

文章目录 一&#xff1a;GPIO输入输出原理二&#xff1a;GPIO基本结构三&#xff1a;GPIO位结构四&#xff1a;GPIO的八种模式道友&#xff1a;相信别人&#xff0c;更要一百倍地相信自己。 &#xff08;推荐先看文章&#xff1a;《 嵌入式-32单片机-GPIO推挽输出和开漏输出》…

virtualbox Ubuntu 网络连接

一、网络连接需求1—— 上网&#xff1a; 虚拟机默认的NAT连接方式&#xff0c;几乎不需要怎么配置&#xff0c;即可实现上网。 enp0s17以太网必须要开启&#xff0c;才能上网&#xff1b; 但是主机ping不通虚拟机&#xff0c;貌似可以ping 127.0.0.1; 二、主机和虚拟机相互p…

机器学习算法实战案例:LSTM实现多变量多步负荷预测

文章目录 1 数据处理1.1 数据集简介1.2 数据集处理 2 模型训练与预测2.1 模型训练2.2 模型多步预测2.3 结果可视化 答疑&技术交流机器学习算法实战案例系列 1 数据处理 1.1 数据集简介 实验数据集采用数据集6&#xff1a;澳大利亚电力负荷与价格预测数据&#xff0c;包括…

FFmpeg 入门

1. 编译 参考文档&#xff1a;FFmpeg编译和集成(FFmpeg开发基础知识)&#xff0c;重点注意这句话&#xff1a; 在MSYS2 Packages可以查到云仓库有哪些包&#xff0c;直接安装可节约大量时间。 注意&#xff1a;这个路径可自定义 吐槽 在看到这篇文章之前&#xff0c;花了大…

赋值运算符和关系运算符

赋值运算符和关系运算符 赋值运算符 分类 符号作用说明赋值int a 10&#xff0c; 将10赋值给变量a加后赋值a b&#xff0c;将a b的值赋值给a-减后赋值a - b&#xff0c;将a - b的值赋值给a*乘后赋值a * b&#xff0c;将a b的值赋值给a/除后赋值a / b&#xff0c;将a b的…