【Mysql】SQL性能分析

article/2025/9/13 22:10:57

【Mysql】SQL性能分析

文章目录

  • 【Mysql】SQL性能分析
    • 1. SQL执行频率
    • 2. 慢查询日志
    • 3. profile详情
    • 4. explain

1. SQL执行频率

在控制台中通过命令 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的 insert,update,delete,select的访问频次:

-- session 是查看当前会话 ;
-- global 是查询全局数据 ;
SHOW GLOBAL STATUS LIKE 'Com_______';(七个下划线)

image-20230204214022177

  • Com_delete: 删除次数
  • Com_insert: 插入次数
  • Com_select: 查询次数
  • Com_update: 更新次数

通过上述命令,我们发现当前数据库是以查询为主,还是以增删改为主,从而为数据库优化提供参考依据。如果是以增删改为主,我们可以考虑不对其进行索引的优化;如果是以查询为主,那么就要考虑对数据库的索引进行优化了。

如果当前数据库是以查询为主,那么我们可以借助于慢查询日志来定位针对于哪些查询语句进行优化。

2. 慢查询日志

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

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

SHOW VARIABLES LIKE 'slow_query_log';

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

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

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

# 重启mysql
systemctl restart mysqld
#查看慢查询日志文件中记录的信息
cat /var/lib/mysql/localhost-slow.log

注:慢日志文件的文件名比一定和我的一样,它跟mysql所在服务器的名字有关,虽然前缀可能不同,但是后缀一定是 -slow.log

再次查询慢查询日志功能是否打开,发现已经打开:

image-20230204220149968

我们再看看慢查询日志地内容:

image-20230204220601444

一开始只有一些基本信息。


测试:

执行以下sql:

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

image-20230204220301506

我们再次查看慢日志文件中记录的信息,我们发现,在慢查询日志文件中,只会记录执行时间超过我们预设时间(2s)的sql。

image-20230204220429524

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


3. profile详情

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

SELECT @@have_profiling ;

image-20230204231432379

可以看到,当前mysql是支持profile操作的。

虽然当前mysql支持profile操作,但是不知道是否已经开启了该功能,我们可以通过如下语句查看:

select @@profiling;

image-20230204231616725

可以看到,当前mysql的profile功能是关闭的,我们可以通过set语句在 session/global级别开启profiling:

SET profiling = 1;

执行完语句之后,再次查看,发现已经开启了功能:

image-20230204231740283


开关已经打开,接下来我们执行的sql语句都会被mysql记录,并且记录执行时间消耗到哪去了。

我们执行以下语句:

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

执行完后,我们再通过 show PROFILES; 查看每一条SQL的耗时基本情况:

image-20230204232349392

如果我们想知道某条语句在各个阶段的耗时情况,可通过如下语句查看:

-- 查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;

image-20230204232736558

我们还可以通过如下语句了解该sql语句在各阶段的cpu的使用情况

-- 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;

4. explain

explain 或者 desc 命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。

语法:

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

image-20230205220739961

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

字段含义
idselect查询的序列号,表示查询中执行select子句或者是操作表的顺序 (id相同,执行顺序从上到下;id不同,值越大,越先执行)。
select_type表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、 UNION(UNION 中的第二个或者后面的查询语句)、 SUBQUERY(SELECT/WHERE之后包含了子查询)等
type表示连接类型,性能由好到差的连接类型为NULL、system、const、 eq_ref、ref、range、 index、all 。
possible_key显示可能应用在这张表上的索引,一个或多个。
key实际使用的索引,如果为NULL,则没有使用索引。
key_len表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长 度,在不损失精确性的前提下, 长度越短越好 。
rowsMySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值, 可能并不总是准确的。
filtered表示返回结果的行数占需读取行数的百分比, filtered的值越大越好。

http://chatgpt.dhexx.cn/article/co2eia5H.shtml

相关文章

MemSQL可以为时间序列应用做些什么

版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于db weekly英文官网,若转载请注明出处。翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库产品团队赞同其观点或证实其内容的真实性。如果其他媒…

MySQL-SQL优化

文章目录 一、插入数据1、insert2、大批量插入数据 二、主键优化(1)数据组织方式(2)页分裂(3)页合并(4)索引设计原则 三、order by优化四、group by优化五、limit优化六、count优化1…

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

众所周知,如果交互式响应时间小于四分之一秒,那么人们会获得令人难以置信的满意度。当你提供的响应时间下降到大约四分之一秒时,交互对用户而言是即时的。 但是,由于大数据集和并发需求,给所有客户提供的速度水平似乎…

速度最快的数据库---MEMSQL的安装与部署

1. 什么是MEMSQL 前Facebook工程师创办的MemSQL公司获500万美元投资。号称世界上最快的分布式关系型数据库,兼容MySQL但快30倍,能实现每秒150万次事务。原理是仅用内存并将SQL预编译为C。2012年12月14,MemSQL 1.8 发布,号称最快的…

memsql-官宣世界最快的内存关系型数据库安装部署

官网地址:https://www.memsql.com/ 获取到的license:BGNhZmY4YjViM2Y1OTRhOTdiOTNlNTE0NmU3MGJhN2NlAAAAAAAAAAAEAAAAAAAAAAwwNAIYJLLETZcXn8NHKfJAS/Iai5hUjzaCMQ5PAhht2vDZAS1q1a49DPsq5gMGKY9AI0wmaSkAAA 1,memsql官网介绍 MemSQL 是一个分布式关系数…

memSQL简介

前言 由前Facebook工程师创办的MemSQL,号称世界上最快的分布式关系型数据库,兼容MySQL但快30倍,能实现每秒150万次事务。原理是仅用内存并将SQL预编译为C。 MemSQL 提供免费的开发者版本(数据限制32G)和全功能试用版…

统一异常处理解决方案

💁 作者:小瓦匠 💖 欢迎关注我的个人公众号:小瓦匠学编程。微信号:xiaowajiangxbc 📢 本中涉及到的所有代码资源,可以在公众号中获取,关注并回复:源码下载 👉…

SpringBoot统一异常处理详解

文章目录 一、概述1、统一异常处理介绍2、原理和目标 二、Assert(断言)1、概述2、Assert自定义实战2.1 自定义接口Assert2.2 自定义异常2.3 Enum整合2.4 实战检测 三、统一异常处理器1、异常处理器说明1.1 handleServletException1.2 handleBindException和handleValidExceptio…

Shell 异常处理

原创:转载请注明出处 #!/bin/bash ##################服务器执行以下脚本############################# ## 重新上传脚本到服务器 -> 部署启动的脚本#当任何一行的命令执行错误的时候(比如命令写错了)直接退出,不继续往下执行…

java中的统一异常处理

目录 统一异常处理的原因 如果进行统一异常处理 1、编写统一异常处理类与方法 2、编写自定义异常类 3、定义异常枚举类 4、抛出指定异常 小提醒 统一异常处理的原因 在我们写代码的时候,因为各种场景需要进行各种校验,我们就可能会进行多种响应&…

JNI异常处理

前言 本文所要介绍的异常处理是指通过JNI调用java层方法时产生的异常处理,并不是指JNI调用Native层函数时产生的异常处理,如果童鞋们想要了解Native层的异常处理可以参考笔者之前的文章《C之异常处理》 按照java的经验,当发生异常而又没有捕…

Python——异常处理

文章目录 异常Python中的异常类捕获与处理异常自定义异常类with语句断言 异常 异常是在程序执行过程中发生的影响程序正常执行的一个事件。异常是Python对象,当Python无法正常处理程序时就会抛出一个异常。一旦Python脚本发生异常,程序需要捕获并处理它…

python异常处理输入不是整数_Python异常处理

异常处理: Python程序运行语法出错会有异常抛出不处理异常会导致程序终止 示例:用户输入一个整数转换成int型,如果用户输入的不是数字而是其他例如字母等则会出现异常 不使用异常处理代码的处理方法 #cat 异常处理.py abc = input("请输入一个数字") if not ab…

ARM的异常处理机制

异常种类 ARM共有如下7种异常模式: 复位(RESET):当处理器复位引脚有效时,系统产生复位异常中断。复位异常中断通常在系统加电和系统复位时发生,直接跳转到复位中断向量处执行称为软复位。未定义的指令(UDE…

spring异常处理

在项目中采用spring的异常处理机制: 示例一、在Controller中加ExceptionHandler注解定义异常拦截的方法,在方法中定义返回的页面: Controller public class ExceptionTestController {ExceptionHandlerpublic String handleException(Excep…

C语言异常处理

文章目录 前言一、 异常表达二、 异常报告三、 异常处理 前言 错误与异常: 错误与异常都是在程序编译或者运行时出现的错误, 不同的是,异常可以被开发人员捕捉和处理;而错误,一般不需要开发人员处理(也无法…

SpringBoot全局异常处理

文章目录 异常处理方案分类基于请求转发基于异常处理器基于过滤器 常见异常处理实现方案1. BasicExceptionController2. ExceptionHandler3. ControllerAdviceExceptionHandler4. SimpleMappingExceptionResolver5. HandlerExceptionResolver6. Filter 全局异常处理实现方案1. …

springboot整合之统一异常处理

特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能操作会略有不同,不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整合…

C++ 异常处理

目录 一、异常的定义 二、异常的抛出和捕获 1.throw 2.try...catch 3.异常安全 4.异常规范 三、系统预定义异常 四、用户自定义异常 一、异常的定义 异常在C用于错误处理,C语言中一般使用返回值表示错误,C对错误处理进行了扩展,统一使…

关于异常处理的知识整理

目录 1.什么是异常? 2.异常继承结构 3.异常结构继承图 4.关于异常处理的两种方式: 5.异常对象有两个非常重要的方法 1.什么是异常? 程序在执行过程中不正常的情况称为异常,以类和对象的形势存在,可以通过异常类&am…