MySQL-性能分析

1、数据库服务器的优化步骤

在这里插入图片描述

2、查看系统性能参数

  • 可以使用show status语句查询一些MySQL数据库服务器的性能参数 执行频率
  • 语法格式:show [ global | session ] status like '参数'
  • 常用性能参数如下所示
参数名说明
connection连接MySQL服务器的次数
uptimeMySQL服务器上线时间
slow_queries慢查询的次数
innodb_rows_readselect 查询返回行数
innodb_rows_inserted执行insert操作插入的行数
innodb_rows_updated执行update操作更新的行数
innodb_rows_delete执行delete操作删除的行数
com_select查询操作的次数
com_insert插入操作的次数。对于批量插入的insert操作,只累加一次
com_update更新操作的次数
com_delete删除操作的次数
last_query_costSQL查询成本

3、慢查询日志(定位执行慢的SQL)

  • MySQL慢查询日志用来记录MySQL中响应时间超过设定阈值的语句,具体运行时间超过 long_query_time 值的SQL将会被记录到慢查询日志中。long_query_time的默认值为 10

  • 默认情况下,MySQL数据库 没有开启慢查询日志,需要手动设置参数。

  • 是调优需要一般不建议启动该参数,因为开启慢查询日志或多或少会对性能造成一定影响。

  • 查询慢查询日志是否开启

mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
1 row in set (0.01 sec)

  • 开启 slow_query_log
mysql> set global slow_query_log = on;
Query OK, 0 rows affected (0.12 sec)

mysql> show variables like 'slow_query_log%';
+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| slow_query_log      | ON                             |
| slow_query_log_file | /var/lib/mysql/rqtanc-slow.log |
+---------------------+--------------------------------+
2 rows in set (0.00 sec)

  • 查询 long_query_time 阈值
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
  • 修改long_query_time 阈值
[root@rqtanc ~]# vim /etc/my.cnf

#设置
long_query_time = 5

#重启mysql
[root@rqtanc ~]# systemctl status mysqld.service
  • 查看慢查询数目
mysql> show status like 'slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 0     |
+---------------+-------+
1 row in set (0.00 sec)

4、慢查询日志分析工具: mysqldumpslow

  • 查看 mysqldumpslow 帮助信息
[root@rqtanc ~]# mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

  --verbose    verbose
  --debug      debug
  --help       write this text to standard output

  -v           verbose
  -d           debug
  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default
                al: average lock time
                ar: average rows sent
                at: average query time
                 c: count
                 l: lock time
                 r: rows sent
                 t: query time  
  -r           reverse the sort order (largest last instead of first)
  -t NUM       just show the top n queries
  -a           don't abstract all numbers to N and strings to 'S'
  -n NUM       abstract numbers with at least n digits within names
  -g PATTERN   grep: only consider stmts that include this string
  -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
               default is '*', i.e. match all
  -i NAME      name of server instance (if using mysql.server startup script)
  -l           don't subtract lock time from total time

  • 分析文件源为:
mysql> show variables like 'slow_query_log_file%';
+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| slow_query_log_file | /var/lib/mysql/rqtanc-slow.log |
+---------------------+--------------------------------+
1 rows in set (0.00 sec)

  • 执行以下语句进行分析
[root@rqtanc ~]# mysqldumpslow -a -s t -t 5 /var/lib/mysql/rqtanc-slow.log

Reading mysql slow query log from /var/lib/mysql/rqtanc-slow.log
Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), 0users@0hosts
  

Died at /usr/bin/mysqldumpslow line 162, <> chunk 1.

5、查看SQL执行成本:show profile

  • 见 MySQL-SQL执行流程及原理 一文

6、分析查询语句:explain

参考 官方文档

  • 定位查询慢的SQL以后,可以使用explain 或 describe 工具做针对性的分析查询语句

  • 基本语法(查询执行计划): explain + SQL 语句 如:

mysql> explain select 1;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

  • explain语句输出列的相关说明
列名说明
id在一个大的查询语句中每个select关键字都对应一个唯一的id
select_typeselect 关键字对应的哪个查询类型
table表名
partitions匹配的分区信息
type针对单表的访问方法
possible_keys可能用到的索引
key实际上用到的索引
key_len实际上使用到的索引长度
ref当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows预估的需要读取的记录条数
filtered某个表经过搜索条件过滤后剩余记录条数的百分比
Extra一些额外信息

6.1、id列

  • id 列的值标识了查询执行中的每一步操作,并反映了这些步骤的执行顺序和嵌套关系。
  • id如果相同,可以认为是一组从上往下执行
  • 在所有组中,id值越大,优先级越高,越先执行
  • 每一个id值表示一趟独立的查询,一个SQL的查询趟数越少越好

6.2、select_type 列

  • 一个大的查询语句中可以包含若干个select关键字,每个关键字代表一个小的查询语句,而每个select关键字的from子句中可以包含若干张表
  • 每一张表对应执行计划输出中的一条记录,对于同一个select关键字中的表来说,他的id值是相同的
查询类型说明
SIMPLE表示查询是简单的 SELECT 查询,不包含任何子查询或联合查询。
PRIMARY表示最外层的 SELECT 查询,也可以称为主查询。
SUBQUERY表示查询中的子查询。
DERIVED表示派生表,这是一个临时表,通常是在 FROM 子句中的子查询结果。
UNION表示联合查询中的第二个或后续的 SELECT。
UNION RESULT表示联合查询结果集的合并。
DEPENDENT SUBQUERY表示依赖外部查询结果的子查询,每次执行都依赖于外部查询的结果。
UNCACHEABLE SUBQUERY表示子查询结果不可缓存,每次执行都重新计算。
MATERIALIZED表示使用了物化表(Materialized Table),这是一个存储预先计算结果的临时表。

6.3、partitions列

  • 出现位置:partitions 列通常出现在执行计划的结果中,用于指示每个操作所涉及的分区信息。
  • 分区名称:对于涉及到分区的操作,partitions 列可能会显示涉及的具体分区名称。
  • 分区范围:对于涉及到范围分区的操作,partitions 列可能会显示涉及的分区范围。
  • 作用
    • 显示分区信息:partitions 列提供了有关查询涉及的分区的信息,包括查询在执行过程中访问了哪些分区。
    • 性能优化:分析查询涉及的分区信息可以帮助优化查询性能,例如确保查询只访问必要的分区,避免不必要的分区扫描。

6.4、type 列

查询类型说明
system表示访问系统表,通常只有一行记录。
const表示通过常量条件进行访问,通常使用索引直接定位到一行记录。
eq_ref表示通过唯一索引进行等值连接,通常用于连接操作。
ref表示通过非唯一索引进行等值连接,可能会返回多个匹配行。
range表示通过索引范围进行访问,通常用于范围查询。
index表示通过索引进行全表扫描,相比于 all 类型,这种访问方法更高效。
all表示全表扫描,通常是最低效的访问方法,应尽量避免。
  • 总结
    • type 列提供了关于查询执行时访问表数据的方式的信息。
    • 分析 type 列的值可以帮助你了解查询执行的效率,从而进行优化。
    • 应该尽量避免使用全表扫描(type 为 all),而更倾向于使用索引来加速查询。

6.5、explain四种输出格式 语法:EXPLAIN FORMAT= [ JSON | TREE | EXTENDED ]

  • 传统格式:表格形势
  • json格式:
    • 将查询执行计划输出为 JSON 格式的数据。这种格式适用于对查询执行计划进行进一步的自动化处理和分析,例如通过脚本进行解析和比较。JSON 格式输出了与标准格式相同的信息,但以 JSON 对象的形式表示,每个属性对应于查询执行计划中的一个字段。
  • tree格式:
    • 树形格式提供了更具可读性的查询执行计划信息。输出结果以树形结构呈现,每个节点代表查询执行计划中的一个操作。每个节点包含的信息通常与标准格式相同,但以树形结构展示,更直观地显示了查询执行的流程和嵌套关系。
  • 拓展格式(EXTENDED)输出:
    • 提供了比标准格式更详细的查询执行计划信息。除了标准格式中的列外,还包括了额外的信息,如每个操作的状态、扫描方式、索引长度等。这种格式适用于对查询执行细节进行深入分析和调优,提供了更多的信息用于性能优化。

6.6、SHOW WARNINGS

  • 用于显示最近执行的语句产生的警告信息。警告通常是一些执行中的问题或不符合预期的情况的提示。
  • SHOW WARNINGS 命令可以帮助你识别并了解这些问题,以便及时采取措施解决。
  • 警告信息可能包含以下内容:
    • Warning:警告的代码或编号。
    • Level:警告的级别,通常是 Note、Warning 或 Error。
    • Message:警告的具体消息描述

7、分析优化器执行计划:trace

  • optimizer_trace 可以跟踪优化器做出得各种决策(如:访问表的方法、各种开销计算、各种转换等,并将跟踪结果记录到 information_schema.optimizer_trace表中)
  • 此功能默认关闭,开启trace并将格式设置为json,同时设置trace最大能够使用的内存大小,避免解析过程中因内存过小而不能够完整展示
  • 可分析的语句:
    • select
    • insert
    • update
    • delete
    • replace
    • explain
    • set
    • declare
    • case
    • if
    • return
    • call

8、MySQL监控分析视图:sys schema

  • 主机相关:以 host_summary开头,主要汇总了IO延迟的信息
  • InnoDB相关:以innodb开头,汇总了innodb buffer信息和事务等待innodb锁的信息
  • I/O相关:以io开头,汇总了等待I/O及使用量的情况
  • 内存使用情况:以memory开头,从主机、线程、事件等角度展示内存使用的情况
  • 连接与会话信息: process list和session相关视图,总结了会话相关情况
  • 表相关:以schema_table开头的视图,展示了表的统计信息
  • 索引信息:统计了索引的使用情况,包含冗余索引和未使用索引的情况
  • 语句相关:以statement开头,包含执行全表扫描,使用临时表,排序等的语句信息
  • 用户相关:以user开头的视图,统计了用户使用的文件I/O、执行语句统计信息
  • 等待事件相关信息:以wait开头,展示等待事件的延迟情况

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

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

相关文章

某大型制造集团企业信息化建设总体规划设计方案(67页PPT)

方案介绍&#xff1a; 随着信息技术的飞速发展&#xff0c;企业信息化建设已成为提高管理效率、增强企业竞争力的重要手段。某大型制造集团为应对市场变化、提升管理水平、优化资源配置&#xff0c;决定进行全面深入的信息化建设。本方案旨在构建一个集生产、管理、销售、物流…

Linux程序开发(十):文件分类器趣味设计

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Win10蓝牙鼠标不能移动问题解决

问题描述&#xff1a;鼠标是没损坏的&#xff0c;使用过程中&#xff0c;光标突然就不能移动了&#xff0c;但右键和滚轮还是有反应。 解决&#xff1a; 1&#xff0c;删除蓝牙设置中的如下配置&#xff08;我只使用了无线鼠标&#xff0c;没有无线键盘&#xff09; 2&#x…

智慧校园为高校带来哪些价值

在21世纪的教育图景中&#xff0c;"智慧"不再仅仅是一个科技名词&#xff0c;它已成为衡量教育现代化水平的重要标志。智慧校园&#xff0c;这一融合了物联网、大数据、云计算等先进技术的教育新形态&#xff0c;正逐步成为高校转型升级的关键驱动力。本文将从多个维…

【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)

https://www.nowcoder.com/practice/562630ca90ac40ce89443c91060574c6?tpId308&tqId40490&ru/exam/oj 排序 滑动窗口 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, k;cin >> n &…

【Java】/*类和对象(下)*/

目录 一、封装 1.1 初识封装 1.2 如何封装成员变量 1.3 如何使用封装后的成员变量 二、访问限定符 三、包 3.1 包的概念 3.2 如何自定义包 3.3 导入包中的类 3.4 包的访问权限控制举例 示例一&#xff1a;private修饰成员变量 示例二&#xff1a; 不去修饰成员变…

有容量限制的车辆路径规划问题(Capacitated Vehicle Routing Problem)

在看matlab的时候发现了这篇文章https://www.frontiersin.org/articles/10.3389/fict.2019.00013/full 仔细阅读一下。(英语渣渣&#xff0c;自学用) The Capacitated Vehicle Routing Problem (CVRP) is an NP-optimization problem (NPO) that has been of great interest …

秋招突击——算法打卡——5/24——无重复字符的最长字串

题目描述 实现代码 // 无重复字符的最长子串 int lengthOfLongestSubstring(string s) {int l 0,r 0;int res 0;unordered_map<char,int> temp;while(l < s.size()){temp[s.at(l)] l;for (r l 1; r < s.size() ; r) {if(temp.count(s.at(r))) break;else te…

CTF网鼎杯2020朱雀组 thinkjava思路记录

1.代码分析 BUUCTF在线评测 (buuoj.cn)打开ctf赛题之后&#xff0c;下载class文件&#xff0c;这个部分是不完整点的源码 在sqldict中存在一个sql注入点&#xff0c;没有采用java的预编译&#xff0c;调用了这个的是在test中&#xff0c;同时&#xff0c;这个采用了swagger接口…

基于 Faster-RCNN 的水稻叶片病害检测方法研究

1 前言 本次分享是使用基于 Faster-RCNN 的水稻叶片病害检测的深度学习算法研究&#xff0c;也是我研究的课题&#xff0c;本文本文使用的算法架构为 Faster R-CNN&#xff0c;研究的课题为使用两种不同的主干特征提取网ResNet-50 和VGG-16 模型进行模型训练和对比评估那…

windows ssh客户端mobaxterm密码登录到debian12 openssh服务器

1&#xff0c;在debian12生成公钥、秘钥 ssh-keygen -t rsa ~/.ssh/id_rsa 是秘钥&#xff0c;要放到windows的&#xff08;这里先不要放&#xff0c;等转换一下再放&#xff09;&#xff1b; ~/.ssh/id_rsa.pub 是公钥&#xff0c;放在debian12本地就好了&#xff0c; 顺…

HCIA第二天复习上

延长传输距离-------中继器&#xff08;放大器&#xff09;------物理层设备 可以延长5倍传输距离 增加网络节点数量 网络拓扑结构 1直线型拓扑 信息安全性差 网络延迟高传输速度慢 2环形拓扑 3星型拓扑 4网状型拓扑 传输效率高&#xff0c;…

MySQL主从复制(docker搭建)

文章目录 1.MySQL主从复制配置1.主服务器配置1.拉取mysql5.7的镜像2.启动一个主mysql&#xff0c;进行端口映射和目录挂载3.进入/mysql5.7/mysql-master/conf中创建my.cnf并写入主mysql配置1.进入目录2.执行命令写入配置 4.重启mysql容器&#xff0c;使配置生效5.进入主mysql&a…

cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求 接了需求&#xff0c;下载excel模版&#xff0c;本来看着还是简单的&#xff0c;然后实现起来一把泪&#xff0c;首先是使用poi&#xff0c;我查了好久&#xff0c;才实现&#xff0c;然后是我用easyexcel又实现了一遍&#xff0c;用了一个周多才实现。 这是需求&#x…

docker实战之搭建MYSQL8.0主从同步

目录 环境配置容器创建主服务器创建MYSQL容器新增my.cnf文件创建用户并授权 从服务器创建MYSQL容器新增my.cnf文件重启MYSQL容器配置主从同步 验证主从同步彩蛋 MySQL 主从同步&#xff08;Master-Slave Replication&#xff09;是一种常用的解决方案&#xff0c;它允许一个主服…

【Redis7】Redis持久化机制之RDB

文章目录 1.RDB简介2.RDB配置触发设置3.RDB的优缺点4.如何检查修复RDB文件5.如何禁用RDB6.RDB参数优化7.总结 1.RDB简介 Redis持久化机制中的RDB&#xff08;Redis Database&#xff09;是一种将Redis在某个时间点的数据以快照形式保存到磁盘上的方法。 原理&#xff1a;RDB通…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…

在链游中,智能合约如何被用于实现游戏内的各种功能

随着区块链技术的快速发展&#xff0c;链游&#xff08;Blockchain Games&#xff09;作为区块链技术的重要应用领域之一&#xff0c;正逐渐展现出其独特的魅力和优势。其中&#xff0c;智能合约作为链游的核心技术之一&#xff0c;对于实现游戏内的各种功能起到了至关重要的作…

k8s的网路配置

目录 1、k8s相关网络类型 1.1 K8S中Pod网络通信 1.2 Overlay Network 1.3 VXLAN 1.3.1 vlan和vxlan的区别 2、Flannel 2.1 简介 2.2 Flannel工作原理 2.3 ETCD之Flannel提供说明 2.4 Flannel部署 2.4.1 在node节点上操作 2.4.2 在master01节点上操作 2.4.2.1 安装f…