mysql 使用profiling和explain来分析查询语句性能

profiling

MySQL Profile 可以用来收集关于查询性能的信息,以便进行性能优化。MySQL 查询 Profile 可以告诉你每个查询花费了多长时间,使用了多少资源,执行了哪些操作等

profiling默认时关闭,使用以下命令开启profiling。

mysql> SET profiling = 1;

然后可以使用 SHOW PROFILES;命令来查看sql执行耗时。会展示一个列表,其中包含每个查询的 ID、执行时间和内存使用情况。

mysql> show profiles;
+----------+------------+-----------------------+
| Query_ID | Duration   | Query                 |
+----------+------------+-----------------------+
|        1 | 0.00014600 | SELECT DATABASE()     |
|        2 | 0.00035250 | select * from account |
+----------+------------+-----------------------+

如果要查看某个sql的详细信息,可以使用

SHOW PROFILE FOR QUERY 查询的Id;查询的ID就是 SHOW PROFILES展示的列表对应的第一列的值。

mysql> show profile for query 2;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000059 |
| Executing hook on transaction  | 0.000005 |
| starting                       | 0.000009 |
| checking permissions           | 0.000007 |
| Opening tables                 | 0.000127 |
| init                           | 0.000006 |
| System lock                    | 0.000009 |
| optimizing                     | 0.000004 |
| statistics                     | 0.000015 |
| preparing                      | 0.000021 |
| executing                      | 0.000042 |
| end                            | 0.000004 |
| query end                      | 0.000003 |
| waiting for handler commit     | 0.000008 |
| closing tables                 | 0.000007 |
| freeing items                  | 0.000010 |
| cleaning up                    | 0.000018 |

在高版本的mysql中,profilling也被提示过时了,被移到performance_schema下一些表中,具体可以看官方介绍

https://dev.mysql.com/doc/refman/8.0/en/performance-schema-query-profiling.html

explain

可以使用explain select语句来查看语句的具体执行计划。它可以显示 MySQL 查询优化器是如何决定执行查询的。通过执行计划,你可以了解到 MySQL 是如何选择索引、连接表以及访问行的顺序的。explain展示的计划结果列表会有以下列信息。

mysql> explain SELECT * FROM test WHERE id =10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | test  | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

来看下具体每列大概意思

1、id

表示查询中执行的顺序,id相同从上到下按顺序执行,一般id越大优先级越高。如果有子查询,则子查询会有不同的 id。子查询会先执行。

2、select_type

SIMPLE:简单查询,没有使用子查询或连表操作

PRIMARY:复杂查询中最外层查询

UNION: union后面的查询

SUBQUERY: 子查询

DERIVED: from引用的子查询

MATERIALIZED: 物化子查询

例1:

explain SELECT * FROM web_shop_order o inner join web_user u on o.uid=u.uid;

两个都是简单查询:SIMPLE

例2:

EXPLAIN SELECT u.uid,u.username,t.nums FROM web_user u INNER JOIN
(SELECT uid,COUNT(1) AS nums FROM web_order2 GROUP BY uid) t ON u.uid=t.uid

最外层的查询就是:PRIMARY

分组子查询是:DERIVED

例3:

EXPLAIN SELECT 1 UNION SELECT 2;

会有三条执行计划信息,第一个查询是:PRIMARY,第二个查询是UNION,最后的结果集是UNION RESULT。

3、table列

表名

4、type

表访问关联类型

  • system

    表只有一行,是下面const类型的一种特殊情况

  • const

​ 表中最多只有一行记录匹配,这种就是在where条件中使用主键等值查询

mysql> explain SELECT * FROM web_user where uid=100;
±—±------------±---------±------±--------------±--------±--------±------±-----±------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±—±------------±---------±------±--------------±--------±--------±------±-----±------+
| 1 | SIMPLE | web_user | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |
±—±------------±---------±------±--------------±--------±--------±------±-----±------+

  • eq_ref

    等值关联。对于来自前一个表的每个行组合,从这个表中读取一行。除了system和const类型之外,这是最好的连接类型。当连接使用索引的所有部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL索引时,使用它。

    mysql>  explain SELECT * FROM web_shop_order o ,web_user u WHERE o.uid=u.uid;
    +----+-------------+-------+--------+---------------+---------+---------+--------------+------+-------------+
    | id | select_type | table | type   | possible_keys | key     | key_len | ref          | rows | Extra       |
    +----+-------------+-------+--------+---------------+---------+---------+--------------+------+-------------+
    |  1 | SIMPLE      | o     | ALL    | NULL          | NULL    | NULL    | NULL         |    8 | Using where |
    |  1 | SIMPLE      | u     | eq_ref | PRIMARY       | PRIMARY | 4       | db_xjy.o.uid |    1 | Using where |
    +----+-------------+-------+--------+---------------+---------+---------+--------------+------+-------------+

  • ref

    普通索引查找。非唯一所有。可能会返回多行。

    mysql> explain SELECT * FROM web_user WHERE username='张三';
    +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------+
    | id | select_type | table    | type | possible_keys | key      | key_len | ref   | rows | Extra                 |
    +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------+
    |  1 | SIMPLE      | web_user | ref  | username      | username | 63      | const |    1 | Using index condition |
    +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------+

  • range

    索引范围扫描,在一个索引列上进行特定范围进行查找。如in、between and、like、大于或小于等这种。

    普通索引也使用。后面的key列对应的使用的索引列。

    mysql> explain select * from web_user where uid in(100,101);
    +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
    | id | select_type | table    | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
    +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
    |  1 | SIMPLE      | web_user | range | PRIMARY       | PRIMARY | 4       | NULL |    2 | Using where |
    +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
    1 row in set (0.00 sec)mysql> explain select * from web_user where username like '曹%';
    +----+-------------+----------+-------+---------------+----------+---------+------+------+-----------------------+
    | id | select_type | table    | type  | possible_keys | key      | key_len | ref  | rows | Extra                 |
    +----+-------------+----------+-------+---------------+----------+---------+------+------+-----------------------+
    |  1 | SIMPLE      | web_user | range | username      | username | 63      | NULL |    9 | Using index condition |
    +----+-------------+----------+-------+---------------+----------+---------+------+------+-----------------------+
    1 row in set (0.00 sec)

  • index

    index类型。一般在联合索引情况下会使用到。分两种情况:

    1、如果判断可以使用索引进行条件过滤,走对应索引。Extra列会显示Using index。

    2、索引无法覆盖所有查询条件,则走全表扫描。

  • ALL

    全表扫描。没什么好说的。没有走索引。

5、possible_keys

可能使用的索引名称。

6、index

实际使用的索引。如果没有选择使用索引,这一列值为null。有时候肯能possible_keys有值,index为NUll可能数据库任务走索引不如全表扫描快。

7、key_len

使用的索引长度。一个索引可能左值匹配使用了部分,也可能是联合索引使用了其中的一部分。

8、ref

这一列显示了哪些字段或者常量被用来和key列对应索引匹配从表中查询数据。

像前面的等值匹配就是常量,连表就是对应的join列。

9、rows

预估扫描行数

10、filtered

符合查询条件的数据百分比

11、Extra

mysql是如何执行该查询的额外的信息。前面说的这些列已经不能完全表名了。就像前面在说type列为index时,如果使用索引会在Extra有Using index信息。

几个常见例子:

Using index:使用索引

Using temporary:使用临时表。一般需要优化

Using filesort:使用外部排序,排序字段不是索引列

Using where: 条件过滤

还有很多,可以查看官方文档https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-extra-information。

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

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

相关文章

【C++】vector的简单使用和实现

vector就是我们之前数据结构学的顺序表,这篇博客就是说一说它的简单使用和底层实现 文章目录 简单使用模拟实现 简单使用 首先,我们看看它的构造函数 我们比较常用的也就是第二种,就是第一个参数是要存的数据个数,第二个是要填…

Python实现利用仅有像素级标注的json文件生成框标注的json文件,并存放到新文件夹

import json import os # create rectangle labels based on polygon labels, and store in a new folder def create_rectangle_shapes(polygon_shapes):rectangle_shapes []for polygon_shape in polygon_shapes:# 获取多边形的坐标点points polygon_shape[points]# 找到最…

C++中new申请内存与释放

上回说到,在C中,我们可以向堆区申请内存空间,我们用到了一个关键字——new,但是和C语言一样,我们在堆区上面申请了空间,系统不会自动释放(除非程序结束),所以说我们需要自…

node 第二十四天 mongoDB shell 命令 高级方法 $where aggregate聚合

$where 数据库数据如下 使用where语法如下 等价于 2.aggregate 聚合 使用聚合管道执行聚合操作。该管道允许用户通过一系列基于阶段的操作来处理来自集合或其他源的数据。 过滤数据, 分组数据 (排除name为 AAA 的数据 按price进行分组 每匹配一组计数1) 下面我们用aggregate…

新一轮范式转移的焦点:边缘

在万物互联的时代里 数据的洪流 正在慢慢转向边缘 👇👇👇 当成千上万的设备接入互联网,大量数据正在边缘产生。在新一轮范式转移的过程中,边缘成为创建和处理数据的关键枢纽。企业该如何有效地管理边缘数据&#x…

Qt QWidget Loading界面并覆盖在其他控件上面

目录 一、效果图二、Loading三、使用 一、效果图 界面中有一个Label&#xff0c;一个Button 点击Buttion&#xff0c;显示Loading的界面&#xff0c;并覆盖到Label和Button上面 二、Loading loadingwidget.h #ifndef LOADINGWIDGET_H #define LOADINGWIDGET_H#include <…

Linux 网络配置及基础服务

目录 一. 查看网络配置信息的相关命令 1.1 ifconfig 命令 作用 1&#xff1a; 作用 2&#xff1a; 拓展&#xff1a; 1.2 ip/ethtool命令 1.3 hostname命令 1.4 route 命令 1.5 netstat 命令 1.6 ss&#xff08;socket statistics&#xff09;命令 1.7 ping 命令 …

[python+selenium]自动下载与当前浏览器驱动版本匹配的webdriver

python使用selenium自动化操作浏览器&#xff0c;隔一段时间Chrome自动升级&#xff0c;或者换一台电脑&#xff0c;相同的脚本又不能运行了。出现错误如下错误&#xff1a; “selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This ve…

小白级教程,10秒开服《幻兽帕鲁》

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或肢解后食用。 前言 马上过年…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…

算法面试八股文『 基础知识篇 』

博客介绍 近期在准备算法面试&#xff0c;网上信息杂乱不规整&#xff0c;出于强迫症就自己整理了算法面试常出现的考题。独乐乐不如众乐乐&#xff0c;与其奖励自己&#xff0c;不如大家一起嗨。以下整理的内容可能有不足之处&#xff0c;欢迎大佬一起讨论。 PS&#xff1a;…

Redis常见问题

击穿 概念&#xff1a;在Redis获取某一key时, 由于key不存在, 而必须向DB发起一次请求的行为, 称为“Redis击穿”。 引发击穿的原因&#xff1a; 第一次访问恶意访问不存在的keyKey过期 合理的规避方案&#xff1a; 服务器启动时, 提前写入规范key的命名, 通过中间件拦截对…

Flask介绍和优势

Flask诞生于2010年&#xff0c;是由Armin Ronacher用Python语言编写的一款轻量级Web开发框架。自发布以来&#xff0c;Flask逐渐成为开发人员喜爱的选择&#xff0c;并在2021年5月发布了Flask 2.0版本&#xff0c;引入了一些新增特性&#xff0c;如基本的异步支持。 使用Flask…

Kotlin:用源码来深入理解 ‘StateFlow和SharedFlow的区别和联系‘

Kotlin&#xff1a;用源码来深入理解 ‘StateFlow和SharedFlow的区别和联系’ 在这篇文章中&#xff0c;我们将深入研究Kotlin中的StateFlow和SharedFlow&#xff0c;以及它们的相似之处和不同之处。我们将通过查看它们的源代码来理解它们的工作原理&#xff0c;这将帮助我们更…

【五】【C++】类与对象(三)

const只读 在 C 中&#xff0c;const 关键字用于声明一个变量为常量&#xff0c;意味着一旦被初始化之后&#xff0c;它的值就不能被改变。 声明常量&#xff1a; 使用 const 关键字可以声明变量为常量。这意味着这个变量的值不能被修改。 const int MAX_SIZE 100; 指针与…

2024.1.31 寒假训练记录(14)

文章目录 CF 1918C XOR-distanceCF 1918D Blocking ElementsCF 1918E ace5 and Task Order CF 1918C XOR-distance 题目链接 这题出思路还挺快的&#xff0c;就是考虑二进制每一位的贡献&#xff0c;可惜写了个假的贪心 正确贪心是&#xff0c;考虑两种情况&#xff0c;第一…

Quartus生成烧录到FPGA板载Flash的jic文件

简要说明&#xff1a; Altera的FPGA芯片有两种基本分类&#xff0c;一类是纯FPGA&#xff0c;另一类是FPGASoc&#xff08;System on chip)&#xff0c;也就是FPGAHPS&#xff08;Hard Processor System&#xff0c;硬核处理器&#xff09;&#xff0c;对应两种Flash烧录方式&a…

【HTML】自定义属性(data)

自定义属性 data: 的用法&#xff08;如何设置,如何获取) &#xff0c;有何优势&#xff1f; data-* 的值的获取和设置&#xff0c;2种方法: 传统方法 getAttribute() 获取 data- 属性值; setAttribute() 设置 data- 属性值getAttribute() 获取 data- 属性值; setAttribute()…

什么是自动化测试分层?3个层次从高到低又是哪些?

自动化测试分层&#xff0c;可以理解为将测试任务分解为多个层次&#xff0c;并在每个层次中定义特定的测试任务和测试范围&#xff0c;通过这种方式&#xff0c;测试人员可以更好地管理和组织测试工作&#xff0c;确保测试的全面性和准确性。 自动化测试可以分解为3个层次&am…

@ControllerAdvice(实现全局异常、全局参数、请求参数预处理)

近期看到了ControllerAdvice这个注解&#xff0c;本身只是为了看下全局异常处理的&#xff0c;简单了解后发现可以分别与ExceptionHandler、ModelAttribute、InitBinder实现 全局异常、全局参数、请求参数预处理 的功能。 目录 一、全局异常处理二、全局参数处理三、请求参数预…