使用SHOW PROFILE

SHOW PROFILE命令默认是禁用的,可以通过以下命令修改

SET profiling=1;

当一条查询提交给服务器时,,此工具会记录剖析信息到一张临时表,并且给查询一个从1开始的整数标识符

SELECT * from poem_config;

```sql
SHOW PROFILES;
```


结果

master >show profiles;
+----------+------------+---------------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------------+
| 1 | 0.00030575 | select * from poem_config |
+----------+------------+---------------------------+

这里可以看到查询执行的精确时间,这个时间是总的时间

SHWO PROFILE FOR QUERY 1

结果

master >show profile for query 1;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000057 |
| checking permissions | 0.000008 |
| Opening tables | 0.000017 |
| init | 0.000021 |
| System lock | 0.000009 |
| optimizing | 0.000004 |
| statistics | 0.000012 |
| preparing | 0.000011 |
| executing | 0.000003 |
| Sending data | 0.000121 |
| end | 0.000005 |
| query end | 0.000007 |
| closing tables | 0.000008 |
| freeing items | 0.000013 |
| cleaning up | 0.000011 |
+----------------------+----------+

剖析报告给出了查询执行的每个步骤及其花费的时间,通过这个报告我们可以确定哪些步骤耗时较长,从而找到对应的优化方法。

使用SHOW STATUS

MySQL的SHOW STATUS命令返回一些计数器,这些计数器可以显示某些活动如读索引的频繁程度,但无法给出消耗了多少时间。

尽管SHOW STATUS无法提供基于时间的统计,但对于执行完查询后观察某些计数器的值还是有帮助的。有时候我们可以从这些值里面猜测哪些代价较高或者消耗的时间较多。

最有用的计数器包括句柄计数器(handler counter)、临时文件和表计数器



示例:

我们先将临时会话级别的计数器重置为0,然后执行查询,再检查计数器的结果

FLUSH STATUS;
SELECT * FROM poem_config;
SHOW STATUS WHERE Variable_name LIKE 'Handler%'
OR Variable_name LIKE 'Created%';

结果

master >SHOW STATUS WHERE Variable_name LIKE 'Handler%'
-> OR Variable_name LIKE 'Created%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Created_tmp_disk_tables | 0 |
| Created_tmp_files | 0 |
| Created_tmp_tables | 0 |
| Handler_commit | 1 |
| Handler_delete | 0 |
| Handler_discover | 0 |
| Handler_external_lock | 2 |
| Handler_mrr_init | 0 |
| Handler_prepare | 0 |
| Handler_read_first | 1 |
| Handler_read_key | 1 |
| Handler_read_last | 0 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 20 |
| Handler_rollback | 0 |
| Handler_savepoint | 0 |
| Handler_savepoint_rollback | 0 |
| Handler_update | 0 |
| Handler_write | 0 |
+----------------------------+-------+

从结果你可以看到,查询没有使用临时表,并且有较多的没有用到索引的读操作(Handler_read_rnd_next),Handler_read_rnd_next的值为20,整个表里的数据也是20条,说明是全表扫描。

未完待续...

MySQL剖析单条查询的更多相关文章

  1. 使用mysql profiling功能剖析单条查询

    5.1版本开始引入show profile剖析单条语句功能,支持show profiles和show profile语句,参数have_profiling;控制是否开启: 查看是否支持这个功能(查询为 ...

  2. mysql笔记03 查询性能优化

    查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...

  3. sql 基础练习 计算7天各个时间点的总和 group by order mysql一次查询多个表

    SQL 基础练习 -- 创建数据库 CREATE DATABASE school CHARACTER SET UTF8; -- 使用数据库 USE school; -- id: 学生的id -- na ...

  4. python 3 mysql 单表查询

    python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...

  5. MySQL 查询优化 - 关联查询

    1. 关联查询执行流程 MySQL执行关联查询的策略很简单,他会从一个表中循环取出单条数据,然后用该条数据到下一个表中寻找匹配的行,然后回溯到上一个表,到所有的数据匹配完成为止.因此也被称为" ...

  6. mysql基础之查询缓存、存储引擎

    一.查询缓存 "查询缓存",就是将查询的结果缓存下载,如果查询语句完全相同,则直接返回缓存中的结果. 如果应用程序在某个场景中,需要经常执行大量的相同的查询,而且查询出的数据不会经 ...

  7. MySQL 执行优化查询

    查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...

  8. 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

    前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...

  9. MySQL 清空慢查询文件

    标签:配置慢查询 概述 本章主要写当慢查询文件很大的时候怎样在线生成一个新的慢查询文件. 测试环境:mysql 5.6.21 步骤 配置慢查询 默认的my.cnf文件在/etc/目录下 vim /et ...

随机推荐

  1. (模板)求逆矩阵luoguP4783

    题目链接:https://www.luogu.org/problem/P4783 题意:求矩阵的逆. 思路:高斯消元法求矩阵的逆,n为400,卡常,我是开了O2优化才AC的.. AC代码: #incl ...

  2. springboot问题

    1.导入数据库jar包后,配置好,发现报错 数据库连接不成功  加上@SpringBootApplication(exclude = DataSourceAutoConfiguration.class ...

  3. Python基础学习路径

    1. Python数据结构 1. 基本数据类型(整数.小数.字符) 1.基本数据类型有5种:int bool float complex long 2.每一种数据类型该如何定义 3.数据类型之间可以强 ...

  4. LC 1. Two Sum

    题目介绍 Given an array of integers, return indices of the two numbers such that they add up to a specif ...

  5. HTNL基础之四

    11.<nav>导航元素 标签定义及使用说明 表示页面中导航链接的部分,例如:传统导航条,侧边栏导航,页内导航,翻页等 <nav> 标签定义导航链接的部分. 并不是所有的 HT ...

  6. Oracle 表分区介绍与使用

    什么是表分区 分区表是将大表的数据分成称为分区的许多小的子集,类型有FAT32,NTFST32,NTFS.另外,分区表的种类划分主要有:range,list,和hash分区.划分依据主要是根据其表内部 ...

  7. AngularJS-03 过滤器

    过滤器 可以对输入的值按照指定的方案进行处理后再输出的函数. 1.货比过滤器currency:{{ currency_expression | currency : symbol}} 2.日期过滤器: ...

  8. 微信小程序手动实现select下拉框选择

    在小程序中没有像h5中的下拉 标签的 picker又满足部了,那就自己动手写 <view class='list-msg'> <view class='list-msg1'> ...

  9. 如何上传HTML5应用到SAP云平台的Cloud Foundry环境下

    先使用WebIDE创建一个HTML5应用.New->Project from Template: 从可选模板里选择SAPUI5 Application: 创建一个HTML5 Module,取名为 ...

  10. Spring Data JPA引入和介绍

    第1章  1.ORM概述[了解] ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能 ...