MySQL高性能(SQL性能分析)

MySQL性能系列


SQL性能分析

  • 前言
  • 1.SQL执行评率
  • [2. 慢查询日志](#2. 慢查询日志)
  • [3. profile详情](#3. profile详情)
  • [4. Explain执行计划](#4. Explain执行计划)
    • [4.1. Explain --- id](#4.1. Explain — id)
    • [4.2. Explain --- type](#4.2. Explain — type)
    • [4.3. Explain --- table](#4.3. Explain — table)
    • [4.4. Explain --- key](#4.4. Explain — key)

前言

本篇文章采用的MySQL版本是8代,同时自己使用的是Linux mysql8,本篇内容主要介绍MySQL的四种性能分析工具。


1.SQL执行评率

查询MySQL中SQL语句的执行评率

语法

sql 复制代码
show [session | global] status like Com_条件

//session:查看当前会话
//global:查询全局数据

Com_______:查询所有CRUD(七个下划线)

Com_delete:删除次数

Com_insert:插入次数

Com_update:修改次数

Com_select:查询次数

使用

sql 复制代码
show global status like `Com_______`;

通过上述指令,可以看到当前数据库到底是以查询为主,还是以增删改为主,从而为数据库优化提供依据。如果以增删为主,可以不考虑对其进行优化,如果是以查询为主,那么就要考虑对数据库的索引进行优化。

想要更加详细的定位SQL语句,可以借助于慢查询日志。

2. 慢查询日志

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

在MySQL中,慢查询日志默认是关闭状态

sql 复制代码
show variables like 'slow_query_log';

查询慢查询日志状态

如果想要开启慢查询日志,需要在MySQL配置文件中配置信息,目前使用的是Docker环境(/root/mysql/conf/my.cnf)中配置


  1. 开启慢查询日志,并配置条件时间。
sql 复制代码
[mysqld]
# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

如图


  1. 配置完毕后,重启Docker,执行查看慢日志语句
sql 复制代码
-- 执行查看慢日志
show variables like 'slow_query_log';
  1. 查询超过目标值的语句

定位查询速度超过2s的SQL语句

sql 复制代码
-- 动态查询日志文件
tail -f xxx-slow.log

3. profile详情

通过慢查询日志能够定位到SQL语句的执行情况,那么每条SQL的耗时情况又该如何查看?这时可以用到profile指令来查看。

MySQL支持profile操作,但同样是关闭的

sql 复制代码
//查询MySQL是否支持profile
SELECT  @@have_profiling ;
//查询profile是否开启
select @@profiling;

开启profile

sql 复制代码
SET  profiling = 1;

执行SQL语句

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各个阶段的耗时情况


4. Explain执行计划

explain:MySQL性能优化神器,查看MySQL是如何处理SQL语句的,分析查询语句或是表结构的性能瓶颈。

语法

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

desc:具有和explain类似的功能,显示SQL执行效率

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

字段 含义
id select查询的序列号,表示查询中执行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 表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下, 长度越短越好 。
rows MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的。
filtered 表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好。
table 表示当前表名

4.1. Explain --- id

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

id的不同情况:

  • id相同:执行顺序从上到下
  • id不同:值越大,越先执行
  • id相同与不同,同时存在,id相同的看做一组,从上往下顺序执行,所有组中,id越大,优先级越高,越先执行

id相同

从上往下顺序执行

id不同

值越大,越先执行

id相同与不同,同时存在

id相同的看做一组,从上往下顺序执行,所有组中,id越大,优先级越高,越先执行


4.2. Explain --- type

type:显示查询使用了哪种类型。

性能从高到低分别是:

NULL > system > const > eq_ref > ref > range > index > all

一般来说,得保证查询至少达到range级别,最好是ref

const:通过一次索引就找到,常用于比较primary key 或者unique索引(主键索引)。

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。

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

查询主键索引,type = const


查询所有,type = null


4.3. Explain --- table

输出行所在的表,例如下图,table显示的表名为:tb_user,最为常见的关键字之一。

4.4. Explain --- key

key

  • 在MySQL中代表所选行显示的索引,如果为NULL,则代表没有使用索引。

如下所示,其中一个的key为fk_student(Foreign Key),表示该数据与表中另一张表(学生表)的记录有关联,与其主键建立关联。

相关推荐
故乡dee云2 小时前
AWS 产品太多不会选?按“网站、数据库、文件、日志”4 类需求快速匹配
数据库·云计算·aws
曹牧4 小时前
C#:问号
前端·数据库·c#
奇树谦4 小时前
《现代 Key-Value 数据库原理:从 B+Tree 到 LSM Tree》-第五篇:现代数据库横向对比
数据库·lsm-tree
李白客4 小时前
分布式集群与数据库产业:从单机到集群的架构跃迁与市场重构
数据库·分布式·架构
福大大架构师每日一题5 小时前
Redis 8.10.0 正式发布:紧凑哈希、批量导入、备份恢复、流与时序能力全面升级
数据库·redis·哈希算法
雨晨源码(同名B站)6 小时前
基于深度学习YoloV11农业病害虫害检测系统 智慧农业信息化综合管理平台 (附源码+lw文档+ppt)
数据库·人工智能·深度学习·yolo·信息可视化
盗理者6 小时前
AI Agent 技能分享|SQL 性能诊断与优化
java·sql·spring·skill
DBA小马哥6 小时前
向量数据库入门到进阶:Embedding、ANN算法与RAG落地的关键术语
数据库·算法·embedding
云和数据.ChenGuang6 小时前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
祈禾7 小时前
Redis三大特殊数据类型
运维·服务器·数据库·redis·笔记·缓存