手把手教你分析MySQL查询性能瓶颈,包教包会
当一条SQL执行较慢,需要分析性能瓶颈,到底慢在哪?
我们一般会使用Explain查看其执行计划,从执行计划中得知这条SQL有没有使用索引?使用了哪个索引?

但是执行计划显示内容不够详细,如果显示用到了某个索引,查询依然很慢,我们就无法得知具体是哪一步比较耗时?
好在MySQL提供一个SQL性能分析工具 — Profile。
Profile 可以帮助我们分析SQL性能瓶颈和资源消耗情况。
1. 查看Profile配置
show variables like '%profil%';

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

注意:修改配置,只对当前会话生效,会话关闭,Profile历史信息被清空。
3. 使用Profile
先造点数据,创建一张用户表:
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命令查看:

输出参数详解:
Query_ID 表示自动分配的查询ID,顺序递增。
Duration 表示SQL语句执行耗时
Query 表示SQL语句内容
然后,我们再使用Query_ID去Profile中查看具体每一步的耗时情况:
show profile for query 1;

可以清楚的看到耗时主要花在创建排序索引(Creating sort index)上面。
再试一条SQL:
select distinct name from user;

这次的耗时主要花在了,创建临时文件、拷贝文件到磁盘、发送数据、删除临时表上面。
由此,可以得知distinct函数会创建临时文件,提醒我们建索引。
我们还可以扩展一下这条分析语句,查看一下cpu和block io的使用情况:
show profile cpu,block io for query 2;

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

以上数据都是基于MySQL5.7版本,在MySQL8.0版本的输出结果字段有些变化。
另外,细心的你应该发现了,在我们每执行完一条SQL,都显示了一条warning信息,我们查看一下具体的warning信息:
show warnings;

意思就是,Profile工具将来有可能被删除,不建议继续使用了。
好吧,下篇文章我们再一块学习一下MySQL提供的,用来替换Profile的最新性能瓶颈分析工具,使用更便捷。
文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。
手把手教你分析MySQL查询性能瓶颈,包教包会的更多相关文章
- 手把手教你分析Mysql死锁问题
前言 前几天跟一位朋友分析了一个死锁问题,所以有了这篇图文详细的博文,哈哈~ 发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题 准备好数据环境 模拟死锁案发 分析死锁日志 分析死锁结果 环境准 ...
- 手把手教你分析解决MySQL死锁问题
在生产环境中如果出现MySQL死锁问题该如何排查和解决呢,本文将模拟真实死锁场景进行排查,最后总结下实际开发中如何尽量避免死锁发生. 一.准备好相关数据和环境 当前自己的数据版本是8.0.22 mys ...
- 大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo
上篇小弟分享了几个“即席查询与分析”的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的“手把手教你搭建即席查询与分析Demo”啥时候能出?说到就得做到,差啥不能差人品,本篇只分享技术干货 ...
- mysqldumpslow 分析slow query日志和explain分析mysql查询结构
mysqldumpslow的使用:比如我们要查询按时间返回前5条日志信息,格式如下:mysqldumpslow -s t -t 5 /var/log/mysql/slowquery_20180303. ...
- 手把手教你看MySQL官方文档
前言: 在学习和使用MySQL的过程中,难免会遇到各种问题.不知道当你遇到相关问题时会怎么做,我在工作或写文章的过程中,遇到不懂或需要求证的问题时通常会去查阅官方文档.慢慢的,阅读文档也有了一些经验, ...
- 【必知必会】手把手教你配置MySQL环境变量——图文详解
一.先决条件 假设我们已经成功安装MySQL数据库.如果还有小伙伴不知道如何安装MySQL数据库,可以在本文下留言,留言数超20,则出一期"手把手教你安装MySQL数据库--图文详解&quo ...
- pt-query-digest分析mysql查询日志
[root@hank-yoon log]# pt-query-digest slowq.log # 200ms user time, 10ms system time, 24.39M rss, 205 ...
- 4.5万字手把手教你实现MySQL TB级数据存储!!
写在前面 业界对系统的高可用有着基本的要求,简单的说,这些要求可以总结为如下所示. 系统架构中不存在单点问题. 可以最大限度的保障服务的可用性. 一般情况下系统的高可用可以用几个9来评估.所谓的几个9 ...
- MySQL索引,MySQL性能分析及explain的使用,分析SQL查询性能
可以使用explain来分析MySQL查询性能,举例如下: 1.使用explain语句去查看分析结果 如 explain select * from test1 where id=1; 会出现: id ...
随机推荐
- C++:制作火把
制作火把 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述: 小红最近在玩一个制作火把的游戏,一开始,小红手里有一根木棍,她希望能够通过这一根木棍通过交易换取制 ...
- 【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现
内容摘要: 需求分析 定义 interface 定义 json 文件 定义列表控件的 props 基于 el-table 封装,实现依赖 json 渲染 实现内置功能:选择行(单选.多选),格式化.锁 ...
- TDSQL|三篇论文入选国际顶会SIGMOD,厉害了腾讯云数据库
好消息!6月13日,腾讯云数据库三篇论文再次入选数据库行业顶会SIGMOD,被SIGMOD 2022 Research Full Paper(研究类长文)收录. 本次被收录的研究成果中,新型数据结构设 ...
- 七牛云创建存储空间并绑定自定义域名-https协议
七牛云创建存储空间并绑定自定义域名-https协议 一.准备 0.绑定自定义域名的前提:你起码拥有过一个备案过的域名[一级域名] 1.在七牛云创建一个存储空间 2.存储空间绑定自定义域名(cdn加速) ...
- Python双人五子棋
这篇文章旨在介绍一个双人的五子棋程序.再次重申,本人不擅长对代码的可读性进行优化,所以可能有些杂乱(在所难免). 先瞅一眼效果图: 请注意,这个棋子--是这么圆润立体!本程序不需任何素材图片,完全用代 ...
- generatorConfig.xml自动生成实体类,dao和xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration ...
- [安洵杯 2019]easy_web-1
1.首先打开题目如下: 2.观察访问的地址信息,发现img信息应该是加密字符串,进行尝试解密,最终得到img名称:555.png,如下: 3.获得文件名称之后,应该想到此处会存在文件包含漏洞,因为传输 ...
- pyenv安装及使用教程
pyenv安装及使用教程 pyenv 安装 git clone https://github.com/pyenv/pyenv.git ~/.pyenv # 编辑 bashrc vim ~/.bashr ...
- ABAP CDS - DEFINE VIEW, name_list
Syntax ... ( name1, name2, ... ) ... Effect Defines the element names of a CDS view in ABAP CDS in a ...
- Optional 类
@Test public void test2(){ Girl girl = new Girl(); // girl = null; //ofNullable(T t):t可以为null Option ...
