MySQL高性能(SQL性能分析)

news2024/11/16 19:59:50

MySQL性能系列


SQL性能分析

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


前言

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


1.SQL执行评率

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

语法

show [session | global] status like Com_条件

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

Com_______:查询所有CRUD(七个下划线)
Com_delete:删除次数
Com_insert:插入次数
Com_update:修改次数
Com_select:查询次数

使用

show global status like `Com_______`;

在这里插入图片描述

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

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

2. 慢查询日志

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

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

show variables like 'slow_query_log';

查询慢查询日志状态

在这里插入图片描述

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


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

如图

在这里插入图片描述


  1. 配置完毕后,重启Docker,执行查看慢日志语句
-- 执行查看慢日志
show variables like 'slow_query_log';

在这里插入图片描述

  1. 查询超过目标值的语句

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

-- 动态查询日志文件
tail -f xxx-slow.log

在这里插入图片描述

3. profile详情

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

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

//查询MySQL是否支持profile
SELECT  @@have_profiling ;
//查询profile是否开启
select @@profiling;

在这里插入图片描述

开启profile

SET  profiling = 1;

执行SQL语句

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

执行指令

-- 查看每一条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语句的,分析查询语句或是表结构的性能瓶颈。

语法

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

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

在这里插入图片描述

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 的值越大越好。
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),表示该数据与表中另一张表(学生表)的记录有关联,与其主键建立关联。

在这里插入图片描述

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

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

相关文章

SOA的设计模式_3.微服务模式

SOA的架构中,复杂的ESB企业服务总线依然处于非常重要的位置,整个系统的架构并没有实现完全的组件化以及面向服务,它的学习和使用门槛依然偏高。而微服务不再强调传统SOA架构里面比较重的ESB企业服务总线,同时SOA的思想进入到单个业…

多态的应用——数组多态

介绍 ai查询 在Java中,动态数组通常通过ArrayList类来实现,它是Java集合框架(Java Collections Framework)的一部分。ArrayList是一个可调整大小的数组实现,提供了比标准数组更多的灵活性和功能。 以下是使用ArrayLis…

安装后或升级启智环境到飞桨2.6版本(develop)

启智社区的启智大脑调试环境非常好用,但是里面的飞桨环境版本比较低,为了能够运行大模型(llm),需要升级飞桨到2.6版本或者开发版本。 首先创建启智大脑调试环境,注意选cuda12.1的环境。 进入调试环境后&am…

Discuz! X3.4免备案无执照接入支付宝微信支付插件

下载地址:Discuz! X3.4免备案无执照接入支付宝微信支付插件 [充值会员]支付宝当面付版 微信支付

MySQL普通表转换为分区表实战指南

码到三十五 : 个人主页 引言 本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表。分区表在处理庞大数据集时展现出显著的性能优势,不仅能大幅提升查询速度,还能有效简化数据维护工作。通过掌握这一技巧能够更好地应对数据密集型应…

简单聊一下Oracle,MySQL,postgresql三种锁表的机制,行锁和表锁

MySQL: MySQL使用行级锁定和表级锁定。行级锁定允许多个会话同时写入表,适用于多用户、高并发和OLTP应用。表级锁定只允许一个会话一次更新表,适用于只读、主要读取或单用户应用。 比如mysql开启一个窗口执行 begin; update xc_county_a…

【C++初阶学习】第十三弹——优先级队列及容器适配器

C语言栈:数据结构——栈(C语言版)-CSDN博客 C语言队列:数据结构——队列(C语言版)-CSDN博客 C栈与队列:【C初阶学习】第十二弹——stack和queue的介绍和使用-CSDN博客 前言: 在前面,我们已经…

SpringMVC[从零开始]

SpringMVC SpringMVC简介 1.1什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean:专…

利用阿里云PAI平台微调ChatGLM3-6B

1.介绍ChatGLM3-6B ChatGLM3-6B大模型是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。 1.1 模型规模 模型规模通常用参数数量(parameters)来衡量。参数数量越多,模型理论上越强大,但也更耗费资源。以下是一些典型模型…

1688商品库存查询

目录 下载安装与运行 功能简介 快速入门(视频) 当前支持的导出项 常用功能 历史商品是什么意思 粘贴商品有什么要求 导入商品需要什么样的模板 单个商品的查看 查看单个商品详情 下载安装与运行 下载、安装与运行 语雀 功能简介 最近一次测…

InternLM Xtuner Qlora 微调

Xtuner 简介 XTuner 是由上海人工智能实验室开发的一款低成本大模型训练工具箱。它以高效、灵活和全能的特性,成为轻量化大模型微调的理想选择。借助 XTuner,用户仅需 8GB 显存即可对 InternLM2-7B 模型进行微调,从而定制出独一无二的 AI 助手…

【OC】类与对象

类与对象 定义类接口部分定义成员变量方法说明实现部分 对象的产生与使用对象与指针self关键字避免重复创建 id类型方法详解方法的所属性形参个数可变的方法 成员变量成员变量及其运行机制多个实例中内存示意图模拟类变量单例模式 类是面向对象的重要内容,我们可以把…

C++进阶:继承

文章目录 继承的概念继承的定义方式继承关系和访问限定符基类和派生类对象的赋值转换继承中的作用域派生类中的默认成员函数构造函数拷贝构造函数赋值拷贝函数析构函数 总结 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允…

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,函数重载的常量左值引用、右值引用,编译器选择哪个执行呢?

看大师写的代码时,除了在类里定义了 copy 构造函数,移动构造函数,还定义了对形参采取万能引用的构造函数,因此有个疑问,这时候的构造函数优先级是什么样的呢?简化逻辑测试一下,如下图&#xff0…

c语言:自定义类型(枚举、联合体)

目录 前言: 1.位段 1.1什么是位段 1.2 位段的内存分配 1.3 位段的跨平台问题 2.枚举 2.1枚举类型的定义 2.2枚举类型的优点 3.联合体(共用体) 3.1联合类型的定义 3.2联合体的特点 3.3联合大小的计算 3.4联合体的实际应用 前言…

【机器学习系列】深入理解集成学习:从Bagging到Boosting

目录 一、集成方法的一般思想 二、集成方法的基本原理 三、构建集成分类器的方法 常见的有装袋(Bagging)和提升(Boosting)两种方法 方法1 :装袋(Bagging) Bagging原理如下图: …

调研管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,教师类型管理,课程类型管理,公告类型管理 前台账户功能包括:系统首页,个人中心,论坛&#…

深度学习之文本分类模型-基于transformer

1、transformer transformer就是大名鼎鼎的论文《Attention Is All You Need》[1],其在一些翻译任务上获得了SOTA的效果。其模型整体结构如下图所示 encoder和decoder 其整体结构由encoder和decoder组成,其中encoder由6个相同的block组成,…

MySQL中的数据库约束

目录 导读: 约束类型 1、not null(不能为空) 2、unique(唯一) 3、default(默认值约束) 4、primary key(唯一)与unique 相同点: 不同点: auto_increment: 5、foreign key(外键) 语法形式&#xff…

GAN的入门理解

这一篇主要是关于生成对抗网络的模型笔记,有一些简单的证明和原理,是根据李宏毅老师的课程整理的,下面有链接。本篇文章主要就是梳理基础的概念和训练过程,如果有什么问题的话也可以指出的。 李宏毅老师的课程链接 1.概述 GAN是…