手把手教你分析MySQL查询性能瓶颈,包教包会

当一条SQL执行较慢,需要分析性能瓶颈,到底慢在哪?

我们一般会使用 Explain查看其执行计划,从执行计划中得知这条SQL有没有使用索引?使用了哪个索引?

手把手教你分析MySQL查询性能瓶颈,包教包会

但执行计划显示内容不够详细,如果显示使用索引,查询还是很慢,不知道哪一步更耗时?

[En]

But the execution plan shows that the content is not detailed enough, if the display uses an index, the query is still very slow, we do not know which step is more time-consuming?

好在MySQL提供一个SQL性能分析工具 — Profile

Profile 可以帮助我们分析SQL性能瓶颈和资源消耗情况。

1. 查看Profile配置

show variables like '%profil%';

手把手教你分析MySQL查询性能瓶颈,包教包会

have_profiling 表示是否支持profile功能,YES表示支持
profiling 表示是否开启profile功能,ON开启,OFF关闭,默认是关闭状态
profiling_history_size 表示保存最近15条历史数据

2. 开启Profile功能

set profiling=1;

手把手教你分析MySQL查询性能瓶颈,包教包会

注意:修改配置,只对当前会话生效,会话关闭, Profile历史信息被清空。

3. 使用Profile

首先创建一些数据并创建用户表:

[En]

First create some data and create a user table:

CREATE TABLE user (
  id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  name varchar(100) NOT NULL DEFAULT '' COMMENT '姓名',
  age tinyint NOT NULL  DEFAULT 0 NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

执行一条耗时SQL:

select * from user order by name;

下面轮到主角 Profile出场了。

我们执行的所有SQL语句都会被记录到 Profile里面,包括执行失败的SQL语句。

可以使用 show profiles命令查看:

手把手教你分析MySQL查询性能瓶颈,包教包会

输出参数详解:

Query_ID 表示自动分配的查询ID,顺序递增。
Duration 表示SQL语句执行耗时
Query 表示SQL语句内容

然后,我们再使用 Query_IDProfile中查看具体每一步的耗时情况:

show profile for query 1;

手把手教你分析MySQL查询性能瓶颈,包教包会

可以清楚的看到耗时主要花在 创建排序索引(Creating sort index)上面。

再试一条SQL:

select distinct name from user;

手把手教你分析MySQL查询性能瓶颈,包教包会

这些时间主要用于创建临时文件、将文件复制到磁盘、发送数据和删除临时表。

[En]

The time spent this time is mainly spent on creating temporary files, copying files to disk, sending data, and deleting temporary tables.

由此,可以得知 distinct函数会创建临时文件,提醒我们建索引。

我们还可以扩展一下这条分析语句,查看一下cpu和block io的使用情况:

show profile cpu,block io for query 2;

手把手教你分析MySQL查询性能瓶颈,包教包会

另外,其实所有 Profile历史数据都被记录在 information_schema.profiling表中,我们也可以查询表得到结果:

select * from information_schema.profiling where Query_ID=2;

手把手教你分析MySQL查询性能瓶颈,包教包会

以上数据都是基于 MySQL5.7版本,在 MySQL8.0版本的输出结果字段有些变化。

另外,细心的你应该发现了,在我们每执行完一条SQL,都显示了一条 warning信息,我们查看一下具体的 warning信息:

show warnings;

手把手教你分析MySQL查询性能瓶颈,包教包会

意思就是, Profile工具将来有可能被删除,不建议继续使用了。

好吧,下篇文章我们再一块学习一下MySQL提供的,用来替换 Profile的最新性能瓶颈分析工具,使用更便捷。

文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。

手把手教你分析MySQL查询性能瓶颈,包教包会

Original: https://www.cnblogs.com/yidengjiagou/p/16587437.html
Author: 一灯架构
Title: 手把手教你分析MySQL查询性能瓶颈,包教包会

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505032/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界

    MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的”精通MYSQL等数据库及优化” 那么我们今天就先来了解一…

    数据库 2023年5月24日
    0148
  • tiler–python实现的有趣的自定义马赛克图像拼接工具

    最近在github中发现了一个有趣的小工具,tiler github链接https://github.com/nuno-faria/tiler 具体介绍请直接去github,这里只…

    数据库 2023年6月11日
    0123
  • 多线程

    public class 多线程 { static boolean flag = true; static class t1 implements Runnable{ @Overr…

    数据库 2023年6月16日
    0133
  • 数据结构入门之用链表模拟栈

    1:栈的介绍: LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间.往往先把拿出去使用. 其限制是仅允许在表的一端进行插入和删除运算。这一端被称…

    数据库 2023年6月6日
    0143
  • 在CentOS 7系统安装StoneDB数据库

    今天我会进行StoneDB数据库在CentOS 7系统下的安装。 在官方的快速部署文档中有详细的安装流程,我会严格遵循流程。 [En] There is a detailed in…

    数据库 2023年5月24日
    0146
  • 未婚妻晚安之后依然在线,于是我用20行代码写了个小工具

    最近发现未婚妻一到晚上总是很忙的样子,每晚匆匆忙忙道过晚安就不说话了。 可是,QQ头像却会偶尔亮起来,我非常担心,是不是账号被盗了呢?然后,就想帮未婚妻排查一下,于是就用pytho…

    数据库 2023年6月14日
    0112
  • Secret加密以及Configmapd配置介绍

    今天我们来了解有关Secret加密以及Configmapd配置介绍 一、Configmapd配置介绍 ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程…

    数据库 2023年6月14日
    0107
  • 从生命周期的角度看线程和进程之间的异同

    概述 进程与线程想必都不陌生,两者有诸多相同点,甚至可以这样说,线程就是”轻量级的进程”。而且两者基本的五个状态也几乎一样,但进程和线程在状态切换时的触发条…

    数据库 2023年6月11日
    0140
  • mysql进阶

    1.二进制格式mysql安装 下载二进制格式的mysql软件包 [root@localhost ~]# cd /usr/src/ [root@localhost src]# wge…

    数据库 2023年5月24日
    0157
  • mybatis-plus详细讲解

    本文笔记都是观看狂神老师视频手敲的,视频地址:https://www.bilibili.com/video/BV17E411N7KN 学java后端的都可以去看一下,从基础到架构很…

    数据库 2023年6月14日
    0147
  • Our Feeling

    走过春夏秋冬走过五湖四海就是没有走过你 看过日出日落看过潮起潮落就是看不到你 本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://…

    数据库 2023年6月11日
    0156
  • 2. 函数

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    0150
  • 删除chrome的域名安全策略

    使用过程中总有特殊情况必须使用http请求、又或者必须使用https请求 目前有两种思路,一种是浏览器默认开了http转https请求,像chrome和Firefox,另一种就是服…

    数据库 2023年6月6日
    0143
  • 03-MySQL事务

    数据库事务 1、事务特性 1.1、原子性 即不可分割性,事务要么全部被执行,要么就全部不被执行 1.2、一致性 事务的执行使得数据库从一种正确状态转换成另一种正确状态 1.3、隔离…

    数据库 2023年6月16日
    0154
  • MySQL(一)——查看密码与修改

    查看数据库密码,策略与修改 RPM安装: 源码安装: 进入:数据库 进入数据库后第一步设置密码: 查看密码策略 修改密码策略,长度 0宽容模式 混合模式,0关闭大小写 特殊字符 O…

    数据库 2023年6月14日
    0150
  • Linux进程管理

    进程管理 基本概念介绍 进程和线程 进程: 一个在内存中运行的应用程序,每一个进程都有自己独立的一块内存空间,并被分配一个ID号(PID),在Windows下可以打开任务管理器查看…

    数据库 2023年6月16日
    0137
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球