MySQL高级【SQL性能分析】

news2024/9/25 9:40:10

目录

1:SQL性能分析

1.1:SQL执行频率

1.2:慢查询日志

1.3:profile详情

1.4:explain


1:SQL性能分析

1.1:SQL执行频率

MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信 息。

通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:

-- session 是查看当前会话 ;
-- global 是查询全局数据 ;
SHOW GLOBAL STATUS LIKE 'Com_______';

Com_delete: 删除次数

Com_insert: 插入次数

Com_select: 查询次数

Com_update: 更新次数

我们可以在当前数据库再执行几次查询操作,然后再次查看执行频次,看看 Com_select 参数会不会 变化。

那么通过查询SQL的执行频次,我们就能够知道当前数据库到底是增删改为主,还是查询为主。 那假如说是以查询为主,我们又该如何定位针对于那些查询语句进行优化呢?

次数我们可以借助于慢查询 日志

接下来,我们就来介绍一下MySQL中的慢查询日志。

1.2:慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有 SQL语句的日志。

MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_log。

 

show variables LIKE 'slow_query_log';

 

Mysql8.0:慢查询日志开启 

 如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

 配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息

/var/lib/mysql/localhost-slow.log。 
systemctl restart mysqld

 然后,再次查看开关情况,慢查询日志就已经打开了。

 Mysql5.5:慢查询日志开启 

set global log_slow_queries = on;  # 开启慢日志
set [session|global]  long_query_time =0.2  # 设置时间.精确的毫秒
set global  log_queries_not_using_indexes = on;  # 设置无索引的查询

测试: A. 执行如下SQL语句 : 

select * from tb_user; -- 这条SQL执行效率比较高, 执行耗时 0.00sec
select count(*) from tb_sku; -- 由于tb_sku表中, 预先存入了1000w的记录, count一次,耗时
13.35sec

 

B. 检查慢查询日志 :

最终我们发现,在慢查询日志中,只会记录执行时间超多我们预设时间(2s)的SQL,执行较快的SQL 是不会记录的。 

 那这样,通过慢查询日志,就可以定位出执行效率比较低的SQL,从而有针对性的进行优化。

1.3:profile详情

show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling 参数,能够看到当前MySQL是否支持profile操作:

SELECT @@have_profiling ;

 

可以看到,当前MySQL是支持 profile操作的,但是开关是关闭的。可以通过set语句在 session/global级别开启profiling: 

SET profiling = 1;

 开关已经打开了,接下来,我们所执行的SQL语句,都会被MySQL记录,并记录执行时间消耗到哪儿去 了。 我们直接执行如下的SQL语句:

select * from tb_user;
select * from tb_user where id = 1;
select * from tb_user where name = '白起';
select count(*) from tb_sku;

执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时: 

-- 查看每一条SQL的耗时基本情况
show profiles;
-- 查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;
-- 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;

 查看每一条SQL的耗时情况:

查看指定SQL各个阶段的耗时情况 :

 

1.4:explain

EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行 过程中表如何连接和连接的顺序。

语法:

-- 直接在select语句之前加上关键字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;

Explain 执行计划中各个字段的含义:

字段

含义

id

select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序。

select_type

表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个 SELECT)等

table

输出结果集的表

type

表示表的连接类型,性能由好到差的连接类型为( system ---> const -----> eq_ref ------> ref -------> ref_or_null----> index_merge ---> index_subquery -----> range -----> index ------> all )

possible_keys

表示查询时,可能使用的索引

key

表示实际使用的索引

key_len

索引字段的长度

rows

扫描行的数量

extra

执行情况的说明和描述

explain 之 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

explain 之 table

展示这一行的数据是关于哪一张表的

explain 之 type

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

type

含义

NULL

MySQL不访问任何表,索引,直接返回结果

system

表只有一行记录(等于系统表),这是const类型的特例,一般不会出现

const

表示通过索引一次就找到了,const 用于比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为一个常亮。const于将 "主键" 或 "唯一" 索引的所有部分与常量值进行比较

eq_ref

类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描

ref

非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)

range

只检索给定返回的行,使用一个索引来选择行。 where 之后出现 between , < , > , in 等操作。

index

index 与 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

explain 之 key

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

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

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

 

explain 之 rows

扫描行的数量。

explain 之 extra

其他的额外的执行计划信息,在该列展示 。

extra

含义

using filesort

说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取, 称为 “文件排序”, 效率低。

using temporary

使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于 order by 和 group by; 效率低

using index

表示相应的select操作使用了覆盖索引, 避免访问表的数据行, 效率不错。

 

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

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

相关文章

2022年的5G行业:“5G+”很火,5G网络迟迟未能普及

作者 | 曾响铃 文 | 响铃说 2022年&#xff0c;5G行业依旧是如火如荼地发展&#xff0c;5G技术继续深刻地改变着我们的生活与生产&#xff0c;影响社会经济发展的方方面面。 回顾过去的一年&#xff0c;5G行业有看点&#xff0c;也有疑虑。 5G网络已基本覆盖全国。截至 202…

PaddleNLP开源基于UIE的情感分析,解决小样本难题,助力客户意见洞察与舆情分析!

情感分析&#xff08;Sentiment Analysis&#xff09;是近年来国内外研究的热点&#xff0c;旨在对带有情感色彩的主观性文本进行分析、处理、归纳和推理。情感分析具有广泛的应用场景&#xff0c;可被应用于消费决策、舆情分析、个性化推荐等领域。 如上图所示&#xff0c;情…

移位操作符、位操作符,原码、反码、补码

整数的二进制的表达形式有3种。原码反码补码下面我们举一个例子吧十进制的2原码&#xff1a;00000000000000000000000000000010&#xff08;常见的形式&#xff09;反码&#xff1a;00000000000000000000000000000010补码&#xff1a;00000000000000000000000000000010小结 正整…

k8s集群部署02

k8s集群部署02k8s集群部署02仍然报错若镜像拉取过慢原因k8s集群部署02 一、pod基本操作Pod是可以创建和管理Kubernetes计算的最小可部署单元&#xff0c;一个Pod代表着集群中运行的一个进程&#xff0c;每个pod都有一个唯一的ip。一个pod类似一个豌豆荚&#xff0c;包含一个或…

Hack the Box CTF 比赛 简单难度 XOR 密码学题目 Crypto 流程| Multikey Walkthrough

这是近期参加HTB夺旗战时遇到的一道难度为简单的密码学Crypto题目。但是我觉得挺有意思&#xff0c;就做下记录。 1. 题目&#xff1a; 题干没有太多的内容&#xff0c;就是一段python程序&#xff0c;和一个output的加密结果&#xff0c;如下。 Python&#xff1a; import …

【数据结构】手推堆实现,拳打堆排序,脚踩Top-k

目录一.完全二叉树的顺序结构二.堆的概念及结构三.堆的实现1.堆向下调整2.向下调整建堆3.向下调整建堆时间复杂度4.堆的插入&#xff08;向上调整&#xff09;5.向上调整建堆6.向上调整建堆时间复杂度7.堆的删除8.堆的代码实现四.Top-K问题五.堆排序一.完全二叉树的顺序结构 堆…

GPIO实验

一、GPIO简介 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出&#xff0c;GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连&#xff0c;从而实现与外部硬件设备的通讯、控制及信号采集等功能 实验步骤1. 通过电路…

第十七讲:神州三层交换机DHCP服务器配置

DHCP是基于Client&#xff0d;Server模式的协议&#xff0c;DHCP客户机向DHCP服务器索取网络地址及配置参数&#xff1b;服务器为客户机提供网络地址及配置参数&#xff1b;当DHCP客户机和DHCP服务器不在同一子网时&#xff0c;需要由DHCP中继为DHCP客户机和DHCP服务器传递DHCP…

java企业通知小程序微信消息推送小程序企业消息通知系统网站源码

简介 本系统主要是利用小程序和springboot开发的企业分组消息推送&#xff0c;主要是员工关注小程序&#xff0c;由分组领导创建消息主体并设置消息提醒时间&#xff0c;利用微信的消息模板对选定的员工进行消息提醒推送。比如公司的技术部需要在11月3号早上8点举行晨会&#…

【Java编程进阶】面向对象思想初识

推荐学习专栏&#xff1a;Java 编程进阶之路【从入门到精通】 文章目录1. 面向对象初识2. 类和对象2.1 类的定义2.2 对象的创建和使用3. 构造方法4. 方法重载5. static 关键字5.1 static 方法5.2 static 变量6. 对象的引用和 this7. 总结1. 面向对象初识 之前我们学习了 C 语言…

P2367 语文成绩和P5542 Painting The Barn S(一维和二维差分)

目录 前言 一、P2367 语文成绩 二、P5542 Painting The Barn S 前言 图文详解一维差分 图文详解二维差分 一、P2367 语文成绩 题目背景&#xff1a; 语文考试结束了&#xff0c;成绩还是一如既往地有问题。 题目描述&#xff1a; 语文老师总是写错成绩&#xff0c;所以当…

关于C语言中内存分配

一、static在C语言里面可以用来修饰变量&#xff0c;也可以用来修饰函数。 1、 先看用来修饰变量的时候。变量在C语言里面可分为存在全局数据区、栈和堆里。 其实我们平时所说的堆栈是栈而不是堆&#xff0c;不要弄混。 例如&#xff1a;在file.c中 int a ; int main() { int b…

如何在 Python 中自动化处理 Excel 表格?

考虑一个场景&#xff0c;要求在网站上为 30,000 名员工创建一个帐户。手动重复执行此任务会非常枯燥乏味。此外&#xff0c;这将花费太多时间&#xff0c;这不是一个明智的决定。 现在想象一下从事数据输入工作的员工的生活。他们的工作是从 Excel 表格中获取数据并将其插入其…

CSS 实现灯笼动画,祝大家元旦快乐

前言 &#x1f44f;CSS 实现大红灯笼动画&#xff0c;祝大家元旦快乐&#xff0c;2023越来越棒&#xff01;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义一个灯笼的背景色bg&#xff0c;线条颜色lineColor :root …

数字时代下, 企业如何保证数据的安全

随着全球数字化进程的蓬勃发展&#xff0c;在互联网时代下技术和数据深度融合的数字经济模式为许多行业带来了更大创收。数据也已经成为了五大核心生产要素之一&#xff0c;驱动着国家、社会、企业全方位高速发展。“迎接数字时代&#xff0c;激活数据要素潜能&#xff0c;推进…

四、 Spring-MVC

MVC MVC &#xff1a;Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计规范。本质上也是一种解耦。 Model&#xff08;模型&#xff09;是应用程序中用于处理应用程序数据逻辑的部分。通常…

使用CLIP构建视频搜索引擎

CLIP(Contrastive Language-Image Pre-training)是一种机器学习技术&#xff0c;它可以准确理解和分类图像和自然语言文本&#xff0c;这对图像和语言处理具有深远的影响&#xff0c;并且已经被用作流行的扩散模型DALL-E的底层机制。在这篇文章中&#xff0c;我们将介绍如何调整…

再获权威认可 百分点科技入选Forrester AI/ML平台主流供应商

近日&#xff0c;全球领先的研究和咨询公司Forrester发布了2022年第四季度中国AI/ML&#xff08;人工智能/机器学习&#xff09;平台报告《The AI/ML Platform Landscape In China, Q4 2022》&#xff0c;系统分析了AI/ML平台市场的业务价值、市场成熟度及市场动态&#xff0c;…

python基础语法24-多线程实操

上一节说了多线程的理论知识,今天来实际操作一下。 1.创建线程 python中有2中方法创建线程,分别为函数和类继承 (1).使用函数来创建线程 调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下: _thread.start_new_thread ( function, args[, kwargs] ) 参数说…

保护小程序,防止反编译:打造不怕反编译的小程序

保护小程序&#xff0c;防止反编译 打造不怕反编译的小程序 这几年,小程序、小游戏&#xff0c;非常火。 业内人都知道&#xff0c;小程序或小游戏&#xff0c;就是H5应用&#xff0c;就是htmlJS。这类应用&#xff0c;反编译很容易&#xff0c;网上就有很多方法教程。 对小…