首页 > 数据库 >MySQL 优化—— SQL 性能分析

MySQL 优化—— SQL 性能分析

时间:2023-08-09 16:46:57浏览次数:34  
标签:语句 show SQL 查询 MySQL query 优化

SQL 性能分析

SQL 执行频率

MySQL 客户端连接成功后,通过 show [session | global] status 命令可以提供服务其状态信息。通过下面指令,可以查看当前数据库 CRUD 的访问频次:

SHOW GLOBAL STATUS LIKE 'Com_______'; 七个下划线代表这个七个占位。

image-20230808194355706

查询数据库中整体的 CURD 频次,一般针对 select 比较多的数据库。

慢查询日志

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

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

# 开启 MySQL 慢查询日志开关
slow_query_log=1

# 设置慢查询的时间为 2 秒,SQL 语句执行时间操作 2 s,就会视为慢查询,并记录到慢查询日志中。
long_query_time=2

配置完成需重启 MySQL 服务器进行测试,查看慢查询日志文件的信息:/var/lib/mysql/localhost-slow.log

查看慢查询日志的开关情况

show variables like 'slow_query_log';

image-20230808194908344

profile 详情

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

SELECT @@have_profiling;

默认情况下是关闭的(0),通过 set 语句可以选择在 session/global 级别开启 profile

SELECT @@profiling;:查看 profiling 是否开启

SET profiling = 1;:开启 profiling

相关操作效果:

# 查看每一条 SQL 的耗时基本情况
show profiles;

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

# 查看指定 query_id 的 SQL 语句 CPU 的使用情况
show profile cpu for query query_id;
  1. show profilesimage-20230809153058154\

    列分别是:SQL 语句的 id,执行时间秒,具体的 SQL 语句。

  2. show profile for query 25

    image-20230809153739009

    这条语句在各个状态的耗时详细情况。

  3. show profile cpu for query 79

    image-20230809154035643

    可以看到具体语句 CPU 的情况。

explain 执行计划

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

语法:explain select 语句

image-20230809155140095

explain 具体字段解析:

image-20230809160930163

image-20230809161206124

那么一般情况下重点关注的是以下几个字段:

image-20230809161608893

  • type:一般业务情况下是优化到 const、ref(如果 type 类型是在后面的话)
  • possible_keys:可能会用到的索引与实际用到的索引进行对比,看看是否能通过索引来进行优化。
  • key:实际用到的索引。
  • key_len:索引的最大长度,越短越好(不丢失精度前提下)。
  • filtered:值越大越好
  • Extra:其他信息,也比较重要。

小结:

对于 SQL 性能分析这章,学习了 4 个点:

  1. SQL 执行频率:查看数据库中查询是否执行频率最高。
  2. 慢查询日志:查询哪些 SQL 语句超过了规定时间,标记为慢查询。
  3. profile 详情:查看具体的 SQL 语句执行的耗时时间,包括各个阶段的用时以及 CPU 情况。
  4. explain\desc:查看具体 SELECT 执行计划,根据查询到的字段去进行 SQL 优化的方案。

后续将学习 SQL 优化的具体方案,以及不同的 SQL 优化。

标签:语句,show,SQL,查询,MySQL,query,优化
From: https://www.cnblogs.com/cndada/p/17617201.html

相关文章

  • 字符串的优化
    C#正确操作字符串编程语言中,字符串类型是操作最频繁的,使用不慎,会带来额外的开销第一、尽量减少装箱。例如stringstr1="stri1"+9;                   //(1)stringstr2="str2"+9.ToString();   //(2)(1)中9发生了装箱的操作,(2)没有发生装箱行......
  • 基于keepalived+gtid半同步主从复制的MySQL集群
    mysql的安装(二进制安装)[root@my-slv1~]#catmysql_install.sh#!/bin/bash#解决软件的依赖关系yuminstallcmakencurses-develgccgcc-c++vimlsofbzip2openssl-develncurses-compat-libs-y#解压mysql二进制安装包tarxfmysql-5.7.38-linux-glibc2.12-x86_64.ta......
  • Oracle慢SQL定位
    统计慢查询耗时select*from(selectsa.SQL_TEXT"执行SQL",sa.EXECUTIONS"执行次数",round(sa.ELAPSED_TIME/1000000,2)"总执行时间",round(sa.ELAPSED_TIME/1000000/sa.EXECUTIONS,2)"平均执行时间",......
  • 堆优化模拟退火(List-Based Simulated Annealing|List-Based SA|LBSA|模拟退火) 算法
    堆优化模拟退火(List-BasedSimulatedAnnealing)算法引入堆优化模拟退火(List-BasedSimulatedAnnealing,简称LBSA)是一种对模拟退火的优化算法。由Shi-huaZhan,[1],[2]JuanLin,[1:1]Ze-junZhang,[1:2]Yi-wenZhong[1:3],[2:1]提出。(以下我们以求最小值为例)解释我们......
  • 记录mysql排序字段有重复值,分页数据错乱问题
    引用http://vsalw.com/9768.html记录mysql排序字段有重复值,分页数据错乱问题,下面2个sql除了分页limit外,其他都一样,但是第三页的结果却包含部分第二页的数据。SELECT id, show_flag, sort, vote_title, img_url, max_option_count, vote_option_type, begin_time, ......
  • MySQL重置密码
    要重置MySQL密码,您需要遵循以下步骤:停止MySQL服务:在您重置密码之前,您需要停止正在运行的MySQL服务。可以使用操作系统的服务管理工具(如Windows的服务管理器)来停止MySQL服务。启动MySQL以跳过权限检查:在启动MySQL时,您可以使用特殊的启动参数来跳过权限检查,从......
  • MySQL配置文件my.cnf的理解
    MySQL配置文件my.cnf的理解一、缘由最近要接手数据库的维护工作,公司首选MySQL。对于MySQL的理解,我认为很多性能优化工作、主从主主复制都是在调整参数,来适应不同时期不同数量级的数据。故,理解透彻my.cnf里的参数是永恒的话题;只有理解透彻了参数设置,才能在某些方面对数据库进......
  • MySQL循环外开启事务的问题
    在Golang中使用GORM操作MySQL,并在循环外开启事务,可以实现在循环内的某一个操作失败时回滚整个事务。其他操作也会被回滚,确保数据的一致性。下面是一个简单的示例代码,演示了如何使用GORM在循环外开启事务并进行相关操作:packagemainimport( "fmt" "log" "gorm.io/d......
  • MySQL并发开启事务与隔离级别相关
    ......
  • MySQL修改my.cnf配置不生效的解决方法
    MySQL修改my.cnf配置不生效的解决方法 这篇文章主要介绍了MySQL修改my.cnf配置不生效的解决方法,简单分析了配置文件的执行顺序与原理并提出解决方法,需要的朋友可以参考下本文实例讲述了MySQL修改my.cnf配置不生效的解决方法。分享给大家供大家参考,具体如下:一、问题:修改了......