手把手教你分析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)

大家都在看

  • 通过Python收集汇聚MySQL 表信息

    一.需求 统计收集各个实例上table的信息,主要是表的记录数及大小。 收集的范围是cmdb中所有的数据库实例。 二.公共基础文件说明 1.配置文件 配置文为db_servers_…

    数据库 2023年6月16日
    0121
  • Vim使用技巧(持续更新)

    好记性不如烂笔头,在这里记录一些Vim使用技巧 vim配置 "拷贝同步&#…

    数据库 2023年6月14日
    087
  • SQL优化

    一、插入优化 批量插入 insert into tb_name values (1,"张三"),(2,"张三"),(3,"张三&q…

    数据库 2023年5月24日
    082
  • MySQL8自增主键变化

    MySQL8自增主键变化 醉后不知天在水,满船清梦压星河。 一、简述 MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看…

    数据库 2023年6月14日
    086
  • MySQL学习(3)—MySQL常用命令

    ps:此随笔基于mysql 5.7.*版本。 准备 net start mysql 启动MySQL服务 net stop mysql 关闭MySQL服务 mysql [-h exi…

    数据库 2023年6月14日
    077
  • Linx__Ubuntu_APT

    apt是Advanced Packaging Tool的简称。 在Ubuntu下,我们可以使用apt命令进行软件包的 更新, 安装, 删除, 清理等 类似于Windows的软件管理…

    数据库 2023年6月14日
    0124
  • fiddler的mock数据与二次开发示例

    fiddler的使用记录 fiddler了解 上官网下载工具,然后安装使用,https://www.telerik.com/fiddler,如果对该工具不熟悉,还有直白的教程,看过…

    数据库 2023年6月6日
    0119
  • 生成随机数的若干种方法

    背景: 创建账户时我们需要配置初始随机密码,使用手机号注册时需要随机验证码,抽奖活动需要随机点名,俄罗斯方块游戏需要随机出形状。这些案例都在说明一个问题,随机数据很重要!而在 Sh…

    数据库 2023年6月14日
    073
  • 在Ubuntu系统上安装StoneDB数据库

    今天我会进行StoneDB数据库在Ubuntu 22.04系统下的安装。 严格按照官方文档的步骤操作,看看安装能否成功。 [En] Strictly follow the step…

    数据库 2023年5月24日
    0105
  • 三分钟图解事务隔离级别,看一遍就懂

    前文说过,”锁” 是数据库系统区别于文件系统的一个关键特性,其对象是 事务,用来锁定的是数据库中的对象,如表、页、行等。锁确实提高了并发性,但是却不可避免地…

    数据库 2023年5月24日
    0121
  • IntelliJ IDEA 2017 永久注册方法

    首先下载:JetbrainsCrack-2.6.10-release-enc.rar rover12421大神开发的下载好后改一下后缀.jar 然后放入到IDEA安装bin目录 在…

    数据库 2023年6月14日
    077
  • 面试题: 字符串转整型 终结者

    随着代码手感增强, 想为这个问题写个终结者系列. 缅怀下曾经的自己. 我们审视下这个问题, 整数字符串转成整数. 那么意味着有效字符仅有 “+-0123456789&#…

    数据库 2023年6月9日
    0100
  • MySQL函数学习(二)—–数值型函数

    注:笔记旨在记录 二、MySQL 数值型函数 \ 函 数 名 称 作 用 完 成 1 RAND 取随机数,可设置参数种子 勾 2 ABS 求x的绝对值 勾 3 SIGN 求x的正负…

    数据库 2023年6月16日
    081
  • 服务器部署 Vue 和 Django 项目的全记录

    本篇记录我在一个全新服务器上部署 Vue 和 Django 前后端项目的全过程,内容包括服务器初始配置、安装 Django 虚拟环境、python web 服务器 uWSGI 和反…

    数据库 2023年6月14日
    097
  • jsp change事件

    业务场景: 导出按钮是否显示的条件如下: 1、必须选择开始时间和结束时间 2、根据筛选条件查询必须存在数据 3、当点击提交后并且满足如上两个条件,导出按钮变为可选后,如果用户修改了…

    数据库 2023年6月9日
    081
  • 2022的七夕,奉上7个精美的表白代码,同时教大家快速改源码自用

    🤵‍♂️ 个人主页:奇想派👨‍💻 作者简介:奇想派,十年全栈开发经验,团队负责人。喜欢钻研技术,争取成为编程达人 🎖️!🗺️学海无涯苦作舟,🛤️编程之路无悔路!📝 如果文章对你有帮…

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