MySQL-性能分析

news2024/11/24 5:38:54

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开头,展示等待事件的延迟情况

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

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

相关文章

如何使用Unity XR Interaction Toolkit

使用环境&#xff1a; Unity2021.3.21f XR Interaction Toolkit v3.0.0 各类函数可用的&#xff1a; 简单项目配置&#xff1a; 第一步&#xff0c;导包&#xff08;samples可以不用导这么多&#xff0c;两个就够了&#xff09;&#xff1a; 第二步&#xff0c;构建场景&a…

c++|priority_queue

priority_queue 前置知识&#xff1a;仿函数priority_queue的模拟实现 前置知识&#xff1a;仿函数 template<class T> struct Less {bool operator()(const T& x, const T& y) // {return x < y;} };priority_queue的模拟实现 通过对priority_queue的底层…

element ui表格动态合并方法

懒得上代码直接截图了 1. 这种方法适合所有合并项全部在一起的 2.还方法可以选择从哪一列开始合并&#xff0c;或者像目录一样从前往后合并

使用 Elastic AI assistant for Observability 来分析日志

在今天的文章中&#xff0c;我们来参考之前的文章 “Elastic AI Assistant for Observability 和 Microsoft Azure OpenAI 入门” 来使用 Elastic AI assistant 分析日志。在本文章中&#xff0c;我们不使用 Azure clould。这样我们之间来进入主题&#xff0c;以免失去注意力。…

Live800:提升客服服务质量,企业应从这几个方面下功夫

客户服务质量&#xff0c;是企业为客户提供优质服务的一个重要衡量指标。通常来说&#xff0c;一个企业的客服部门在其经营活动中发挥着重要作用&#xff0c;是客户与企业之间沟通的桥梁。良好的客服服务&#xff0c;不仅能够提高客户满意度&#xff0c;还能增强企业品牌的美誉…

pcd点云江湖之处处碰壁:点云文件pcd加载02

江湖好汉&#xff0c;休走&#xff0c;废了半天力气把threejs自带的代码搬迁到自己项目中了&#xff0c;高高兴兴给领导看。领导一句话&#xff0c;顿时无奈&#xff1a;领导曰&#xff1a;点云单色太丑&#xff0c;能不能按照分类展示&#xff1f; 一句话难道英雄好汉&#xf…

Redis主从、哨兵、cluster集群的部署和细节

目录 1. 主从模式 为什么需要主从&#xff1f; 搭建主从架构 2. Sentinel(哨兵)模式 为什么需要哨兵模式&#xff1f; 搭建哨兵集群 哨兵集群 Go语言编程redis哨兵模式 有了哨兵&#xff0c;客户端连接谁&#xff1f; test1&#xff1a;redis节点主从切换 test2&am…

linux内核memory model

一、背景   操作系统的一个重要功能就是管理计算机中的各种硬件资源&#xff0c;比如说CPU、内存、显存、串口等&#xff0c;其中内存是这些资源中很珍贵的部分&#xff0c;所以为了能把内存管理好做了很多工作。硬件内存架构是不停地发展变化的&#xff0c;内核中管理内存的…

Python 实现Word (DOC或DOCX)与TXT文本格式互转

目录 引言 安装Python库 使用Python将Word转换为TXT文本格式 使用Python将TXT文本格式转换为Word 引言 Word文档和TXT文本文件是日常工作和生活中两种常见的文件格式&#xff0c;各有其特点和优势。Word文档能够保留丰富的格式设置&#xff0c;如字体、段落、表格、图片等…

Flink 生态对 Confluent / Kafka Schema Registry 支持情况的研究报告

文章目录 1. Flink CDC 对 Confluent Schema Registry 的支持情况2. Confluent Avro Format 对 Confluent Schema Registry 的支持情况3. 关键性结论 这几年&#xff0c;在流式链路上引入一个 Schema Registry 变得越来越流行&#xff0c;也越来越有必要&#xff0c; Schema Re…

HX6203是一个完整的电池充电器控制器的两个(8.4V)电池锂离子电池芯片IC

一般描述 该HX6203是一个完整的电池充电器控制器的两个(8.4V)电池锂离子电池。HX6203为快速充电锂离子电池提供了一种小巧、简单、高效的解决方案。一个外部检测电阻以高精度设置充电电流。 内部电阻分压器和精密参考设置的最终浮动电压为8.4V时&#xff0c;输入…

宁盾与深信服发布联合方案,解决云桌面及微软AD完整替代

自 Citrix 退出中国市场后&#xff0c;不少中大型企业关心国产云桌面脱离微软 AD 域是否还能正常工作。在2024年3月初&#xff0c;宁盾身份目录与深信服桌面云完成兼容互认证&#xff0c;对于企业的疑问给出了官方回应。 5月10日&#xff0c;在深信服《Citrix离场背景下&#…

草图大师2024怎么保存低版本呢?插件怎么写?

草图大师是一款流行的绘图和设计软件&#xff0c;为了向后兼容&#xff0c;保存低版本文件时&#xff0c;可以采取以下步骤&#xff1a; su模型库 1.另存为旧版本格式&#xff1a; 在保存文件时&#xff0c;草图大师通常会提供一个选项&#xff0c;让你选择要保存的文件格式和…

plsql 学习

过程化编程语言 赋值&#xff1a;&#xff1a; ||&#xff1a;连接符号 dbms_output.put_line() :输出的语句 var_name ACCOUNTLIBRARY.USERNAME%type; 变量名&#xff1b;某个表的数据类型&#xff1b;赋值给变量名 用下面的方法更好用 异常exception 循…

Mixiy(米思齐)安装

Mixiy(米思齐)安装 官网地址&#xff1a;爱上米思齐 打开官网&#xff0c;选择下图的软件进行下载 复制提取码&#xff0c;点击链接跳转到网盘进行下载&#xff0c;选择(RC4完整版) 下载完成后&#xff0c;解压到合适的位置&#xff0c;进入文件夹&#xff0c;双击Mixly.exe即…

小程序的深层了解

一:wxss的全局样式和局部样式 写在文件上,第一个路径会执行全局和局部自带的wxss给wxml,会执行wxml,会执行json和js. 无论那个文件都会执行文件夹内的和外部的app.wxss,但是如果有一样的属性,则看属性的权重,权重一样,则设置局部样式. 二:全局配置 wx:key"写的是data内…

实操专区-第13周-课堂练习专区-折线图和阶梯图

实操专区-第13周-课堂练习专区-折线图和阶梯图 下载安装ECharts&#xff0c;完成如下样式图形。 代码和截图上传 基本要求&#xff1a;下图2选1&#xff0c;完成代码和截图 完成 3.1.3.12 折线图和阶梯图中的任务点 基本要求&#xff1a;2个选一个完成&#xff0c;多做1个加2分…

Linux网络——TCP协议详细讲解

目录 前言 一、TCP报头格式 1.首部长度 2.窗口大小 3.序号与确认序号 4.标志位 4.1 PSH 4.2 RST 5.紧急指针 6.TCP检验和 二、超时重传 三、连接管理机制 四、滑动窗口 五、拥塞控制 六、延迟应答 七、为什么TCP这么复杂? 前言 前面我们学习了TCP协议套接字的…

DFS:解决二叉树问题

文章目录 了解DFS1.计算布尔二叉树的值思路代码展示 2.求根节点到叶节点数字之和思路代码展示 3.二叉树剪枝思路代码展示 4.验证二叉搜索树思路分析代码展示 5.二叉搜索树中第k小元素思路&#xff1a;代码展示 6.二叉树的所有路径思路分析代码展示 总结 了解DFS 所谓DFS就是就…