【MySQL】分析SQL的几种方式

news2025/1/16 17:51:38

文章目录

      • 一、查看SQL执行频率
      • 二、定位低效率执行SQL
        • 1. show processlist
        • 2. 慢查询日志
      • 三、explain分析执行计划
        • 1. id
        • 2. select_type
        • 3. type
        • 4. key
        • 5. extra
      • 四、show profile

一、查看SQL执行频率

show session status:显示 session 级的统计结果(不写参数默认session)

show global status:显示 global 级的统计结果

mysql> show status like 'Com_______';   -- 查看各种类型SQL的执行次数
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_binlog    | 0     |
| Com_commit    | 2     |
| Com_delete    | 0     |
| Com_import    | 0     |
| Com_insert    | 35    |
| Com_repair    | 0     |
| Com_revoke    | 0     |
| Com_select    | 13    |
| Com_signal    | 0     |
| Com_update    | 0     |
| Com_xa_end    | 0     |
+---------------+-------+
11 rows in set (0.00 sec)

mysql> show global status like 'Com_______';   -- 查看各种类型SQL的执行次数
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_binlog    | 0     |
| Com_commit    | 4     |
| Com_delete    | 4     |
| Com_import    | 0     |
| Com_insert    | 35    |
| Com_repair    | 0     |
| Com_revoke    | 0     |
| Com_select    | 291   |
| Com_signal    | 0     |
| Com_update    | 11    |
| Com_xa_end    | 0     |
+---------------+-------+
11 rows in set (0.00 sec)

mysql> show status like 'Innodb_rows_%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Innodb_rows_deleted  | 0     |   -- 删除的行数
| Innodb_rows_inserted | 0     |   -- 插入的行数
| Innodb_rows_read     | 0     |   -- 读取的行数
| Innodb_rows_updated  | 0     |   -- 更新的行数
+----------------------+-------+
4 rows in set (0.00 sec)
参数含义
Com_select执行 select 操作的次数,一次查询只累加 1。
Com_insert执行 INSERT 操作的次数,对于批量插入的 INSERT 操作,只累加一次。
Com_update执行 UPDATE 操作的次数。
Com_delete执行 DELETE 操作的次数。
Innodb_rows_readselect 查询返回的行数。
Innodb_rows_inserted执行 INSERT 操作插入的行数。
Innodb_rows_updated执行 UPDATE 操作更新的行数。
Innodb_rows_deleted执行 DELETE 操作删除的行数。
Connections试图连接 MySQL 服务器的次数。
Uptime服务器工作时间。
Slow_queries慢查询的次数。

Com_xxx :这些参数对于所有存储引擎的表操作都会进行累计。

Innodb_xxx :这几个参数只是针对InnoDB 存储引擎的,累加的算法也略有不同。

二、定位低效率执行SQL

1. show processlist

查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化

在这里插入图片描述

1) id列,用户登录mysql时,系统分配的"connection_id",可以使用函数connection_id()查看

2) user列,显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句

3) host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户

4) db列,显示这个进程目前连接的是哪个数据库

5) command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等

6) time列,显示这个状态持续的时间,单位是秒

7) state列,显示使用当前连接的sql语句的状态,很重要的列。state描述的是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过copying to tmp table、sorting result、sending data等状态才可以完成

8) info列,显示这个sql语句,是判断问题语句的一个重要依据

2. 慢查询日志

通过慢查询日志定位那些执行效率较低的 SQL 语句,用–log-slow-queries[=file_name]选项启动时,mysqld 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件

MySQL Server 层四个日志

三、explain分析执行计划

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

type

完整的访问方法如下: system ,const ,eq_ref ,ref ,fulltext ,ref_or_null ,index_merge , unique_subquery ,index_subquery , range , index ,ALL

  • const:当我们根据主键或者唯一二级索引列与常量等值匹配时,对单表的访问方法就是const,只匹配一条记录
  • ref:普通二级索引等值匹配常量
  • range:走索引的范围查询
  • index_merge:用到多个索引(多个select,比如子查询)
  • index:需要扫描整个索引树(比如联合索引只用到右边的字段,和查询数据可以组成联合索引)
  • ALL:不走索引,全表扫描,读磁盘

key: 用到的索引

key_len: 用到索引的占用的字节数,针对联合索引有一定的参考价值

ref

  • const:常量等值匹配

rows: 预估需要读取的记录数,越小越好

Extra

  • using filesort:排序
  • using index:表示使用索引,且没有回表(覆盖索引)
  • using where:表示使用索引,且需要回表
  • using index condition:索引下推
1. id

1) id 相同表示加载表的顺序是从上到下

explain select * from t_role r, t_user u, user_role ur where r.id = ur.role_id and u.id = ur.user_id ;

在这里插入图片描述

2) id 不同id值越大,优先级越高,越先被执行

EXPLAIN SELECT * FROM t_role WHERE id = (SELECT role_id FROM user_role WHERE user_id = (SELECT id FROM t_user WHERE username = 'stu1'))

在这里插入图片描述

3) id 有相同,也有不同。id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id的值越大,优先级越高,越先执行

EXPLAIN SELECT * FROM t_role r , (SELECT * FROM user_role ur WHERE ur.`user_id` = '2') a WHERE r.id = a.role_id ; 

在这里插入图片描述

2. select_type

表示 SELECT 的类型,常见的取值,如下表所示:

select_type含义
SIMPLE简单的select查询,查询中不包含子查询或者UNION
PRIMARY查询中若包含任何复杂的子查询,最外层查询标记为该标识
SUBQUERY在SELECT 或 WHERE 列表中包含了子查询
DERIVED在FROM 列表中包含的子查询,被标记为 DERIVED(衍生) MYSQL会递归执行这些子查询,把结果放在临时表中
UNION若第二个SELECT出现在UNION之后,则标记为UNION ; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为 : DERIVED
UNION RESULT从UNION表获取结果的SELECT

在这里插入图片描述

在这里插入图片描述

3. type

type 显示的是访问类型,是较为重要的一个指标,可取值为:

type含义
NULLMySQL不访问任何表,索引,直接返回结果
system表只有一行记录(等于系统表),这是const类型的特例,一般不会出现
const表示通过索引一次就找到了,const 用于比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为一个常亮。const于将 “主键” 或 “唯一” 索引的所有部分与常量值进行比较
eq_ref类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描
ref非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)
range只检索给定返回的行,使用一个索引来选择行。 where 之后出现 between , < , > , in 等操作。
indexindex 与 ALL的区别为 index 类型只是遍历了索引树, 通常比ALL 快, ALL 是遍历数据文件。
all将遍历全表以找到匹配的行

NULL > system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

system > const > eq_ref > ref > range > index > ALL

4. key

possible_keys : 显示可能应用在这张表的索引, 一个或多个。

key : 实际使用的索引, 如果为NULL, 则没有使用索引。

key_len : 表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下, 长度越短越好 。

5. extra
  • using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取, 称为 “文件排序”,效率低
  • using temporary:使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于 order by 和 group by; 效率低
  • using where:表示使用索引,且需要回表
  • using index:表示相应的select操作使用了覆盖索引, 避免访问表的数据行, 效率不错
  • using index condition:联合索引生效,但是需要回表,并没有用到覆盖索引,需要优化,避免使用select *

四、show profile

开启profiling 开关:set profiling=1;

执行完SQL后,再执行show profiles 指令, 来查看SQL语句执行的耗时:

在这里插入图片描述

通过show profile for query [query_id] 语句可以查看到该SQL执行过程中每个线程的状态和消耗的时间:

在这里插入图片描述

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

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

相关文章

分享261个Python源码源代码总有一个是你想要的

链接&#xff1a;https://pan.baidu.com/s/14t-pmuphJQ-ouqQlOuwtiA?pwd8888 提取码&#xff1a;8888 项目名称 AI悦创Python小项目代码 AI视频创作ffmpegopenai-whispertts Apache Superset数据探查与可视化平台 v2.0.1 API Star工具箱 v0.7.2 Archery SQL审核查询平台 …

星型灯/南瓜灯/饰品灯/圣诞灯,各国检测标准有哪些?

星型灯/南瓜灯/饰品灯/圣诞灯&#xff0c;各国检测标准有哪些&#xff1f; 圣诞装饰灯作为热销产品&#xff0c;出于库存考虑&#xff0c;美国80%进口灯饰的采购在8-10月完成&#xff0c;而中国产品占这些进口灯饰的85&#xff05;左右&#xff0c;并且几乎所有LED灯都来自中国…

无法访问 github ,解决办法

一、使用代理&#xff08;首选&#xff09; 这种办法只需要更改github.com为代理的域名即可&#xff0c;使用方式与GitHub除了域名不同其他都一样&#xff0c;速度挺快&#xff0c;可登陆&#xff0c;可提交。 1、查看当前的代理&#xff1a; git config --global --get htt…

分享135个游戏Python源代码总有一个是你想要的

分享135个游戏Python源代码总有一个是你想要的 链接&#xff1a;https://pan.baidu.com/s/1rQuDok6XRWp-7RzFAfew8w?pwd8888 提取码&#xff1a;8888 游戏项目名称 100%基于Python的&#xff0c;模仿元气骑士的游戏 Chinese Chess Xiangqi 中国象棋 Python Firefly是…

c语言-消息队列

一、消息队列的介绍 消息队列的实现原理是将消息存储在一个队列中&#xff0c;生产者将消息放入队列的尾部&#xff0c;消费者从队列的头部取出消息进行处理。消息队列通常采用先进先出&#xff08;FIFO&#xff09;的方式进行消息的存储和处理。消息队列可以实现异步通信&…

软件安全性测试包含哪些类型?2023年专业软件安全测试报告获取

在现今信息化时代&#xff0c;软件安全性问题愈加引起人们的重视。为了确保软件的安全性&#xff0c;软件安全性测试成为不可或缺的一环。   软件安全性测试是指对软件系统进行全面、系统、综合的安全性评估和控制&#xff0c;旨在发现和证明软件系统存在的漏洞和安全隐患&am…

linux 下的java gate服务断掉的原因及解决思路

一.查询断掉的原因 1.查看gate日志&#xff0c;发现没有报错信息&#xff0c;突然就断了 2.查看是不是OOM导致 dmesg | grep java 发现确实Out of Memory了 3.发生问题的原因&#xff1a; 默认情况下, Linux kernels(内核)允许进程申请的量超过系统可用内存. 这是因为,在大多数…

成都瀚网科技有限公司:开抖音店铺有哪些注意事项?

成功经营一个小店不仅仅是发布产品视频那么简单&#xff0c;还需要注意一些重要的事情。开抖音店铺需要注意以下几点&#xff1a; 1、开抖音店铺有哪些注意事项&#xff1f; 合规管理&#xff1a;在抖音开店&#xff0c;首先要确保自己的运营合规。遵守相关法律法规及平台规定&…

【Linux进行时】进程控制

1.进程创建&#xff1a; 1.1fork函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 \#include <unistd.h> pid_t fork(void); 返回值&#xff1a;子进程中返回0&#xff0c;父进程返…

coreldraw2023永久免费版安装包下载

有小伙伴在用电脑查找软件程序的时候&#xff0c;看到了一款叫cdr软件的应用&#xff0c;自己之前没接触过&#xff0c;不知道cdr是什么软件&#xff1f;cdr软件是干什么的&#xff1f;十分好奇。其实它是一款平面设计软件&#xff0c;下面就给大家介绍下相关的cdr软件的知识。…

Spanner: Google’s Globally Distributed Database

1. INTRODUCTION Spanner可以扩展到跨数百个数据中心的数百万台机器与数万亿个数据库行。 Spanner是一个可伸缩、全球化分布的数据库&#xff0c;其由Google设计、构建、并部署。在抽象的最高层&#xff0c;Spanner是一个将数据分片&#xff08;shard&#xff09;到分布在全世…

C语言实现输入一个整数,输出该整数的所有素数因子。例如,输入 120, 输出 2、3 、5

完整代码&#xff1a; //输入一个整数&#xff0c;输出该整数的所有素数因子。例如&#xff0c;输入 120, 输出 2、3 、5 #include<stdio.h>//判断一个数n是否为素数 int isPrimeNumber(int n){//1不是素数if (n1){return 0;}for (int i 2; i <(n/2); i){//当有n能被…

E048-论坛漏洞分析及利用-针对Wordpress论坛插件实现远程代码执行的探索

课程名称&#xff1a; E048-论坛漏洞分析及利用-针对Wordpress论坛插件实现远程代码执行的探索 课程分类&#xff1a; 论坛漏洞分析及利用 实验等级: 中级 任务场景: 【任务场景】 小王接到磐石公司的邀请&#xff0c;对该公司旗下论坛进行渗透测试&#xff0c;已经发现…

基于STM32F103C8T6的BLDC驱动硬件设计

一、STM32F103C8T6简介&#xff1a; STM32F103C8T6是意法半导体公司&#xff08;ST&#xff09;推出的基于Cortex-M3内核的32位微控制。CPU内核&#xff1a;ARM Cortex-M3&#xff1b;CPU最大主频&#xff1a;72MHz &#xff1b;工作电压范围&#xff1a;2V~3.6V &#xff1b;程…

华为OD机试 - 欢乐的周末 - 深度优先搜索dfs算法(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、深度优先搜索dfs五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明4、如果修改一下呢&#xff1f;5、来&#xff0c;TFBOYS&#xff0c;试一下&#xff1f; 华为OD机试 2023B卷题库疯狂收录中&#xff0c;…

Vue-router快速入门 是什么 如何跳转 如何传值的问题

3.1 Vue-router是什么 Vue-router:Vue.js 的官方路由为 Vue.js 提供富有表现力、可配置的、方便的路由 官网&#xff1a;https://router.vuejs.org/zh/ 作用&#xff1a; 1.实现vue页面(组件)的跳转 2.可以在跳转的时候携带参数 3.2 Vue3使用Vue-router(静态路由) 基于Vu…

PythonOcc + pyqt 显示——stp step文件导入 部件识别 爆炸图展示

使用 occ 7.4.0 版本,pyqt5, 解决了init 缺少window_handle 的问题,另外添加一个左边的显示窗口 import ctypes import logging import os import sysfrom OCC.Display import OCCViewer from PyQt5 import QtCore, QtGui, QtOpenGL, QtWidgets# check if signal available, …

电脑技巧:PrivaZer电脑清理工具介绍(附下载)

今天给大家推荐一款非常实用的电脑垃圾清理工具&#xff0c;感兴趣的朋友可以下载看看&#xff01; 下载&#xff1a;飞猫盘&#xff5c;文件加速传输工具&#xff5c;云盘&#xff5c;橘猫旗下新概念云平台 一、软件介绍 PrivaZer是一款免费好用的老牌清理软件&#xff0c;除…

4.4 网际控制报文协议ICMP

思维导图&#xff1a; 4.4 网际控制报文协议ICMP - 笔记 --- **定义**: - 网际控制报文协议ICMP(Internet Control Message Protocol)是根据[RFC 792]定义的一种协议。它的主要功能是为了提高IP数据报的转发效率和确保交付的成功率。 **主要功能**: 1. **差错报告**: ICMP允…

LeetCode算法位运算—只出现一次的数字

目录 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 补充 异或的重要性质 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 给你一个 非空 整数数组 nums &#xff0c;除了某…