MySQL剖析单条查询
使用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剖析单条查询的更多相关文章
- 使用mysql profiling功能剖析单条查询
5.1版本开始引入show profile剖析单条语句功能,支持show profiles和show profile语句,参数have_profiling;控制是否开启: 查看是否支持这个功能(查询为 ...
- mysql笔记03 查询性能优化
查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...
- sql 基础练习 计算7天各个时间点的总和 group by order mysql一次查询多个表
SQL 基础练习 -- 创建数据库 CREATE DATABASE school CHARACTER SET UTF8; -- 使用数据库 USE school; -- id: 学生的id -- na ...
- python 3 mysql 单表查询
python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...
- MySQL 查询优化 - 关联查询
1. 关联查询执行流程 MySQL执行关联查询的策略很简单,他会从一个表中循环取出单条数据,然后用该条数据到下一个表中寻找匹配的行,然后回溯到上一个表,到所有的数据匹配完成为止.因此也被称为" ...
- mysql基础之查询缓存、存储引擎
一.查询缓存 "查询缓存",就是将查询的结果缓存下载,如果查询语句完全相同,则直接返回缓存中的结果. 如果应用程序在某个场景中,需要经常执行大量的相同的查询,而且查询出的数据不会经 ...
- MySQL 执行优化查询
查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...
- 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序
前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...
- MySQL 清空慢查询文件
标签:配置慢查询 概述 本章主要写当慢查询文件很大的时候怎样在线生成一个新的慢查询文件. 测试环境:mysql 5.6.21 步骤 配置慢查询 默认的my.cnf文件在/etc/目录下 vim /et ...
随机推荐
- codeforces 1249D1/D2 Too Many Segments (贪心)
(点击此处查看原题) 题意说明 有n个区间,第i个区间覆盖范围[li,ri]内所有点,问删除最少哪些区间,使得所有点被区间覆盖的次数少于等于k次 解题思路 看到这个题的时候,觉得和开关(反转)问题很像 ...
- redis键空间通知(keyspace notification)
一.需求 在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作. 二.环境 系统:windows10 php:7.1 redis ...
- jquery tablesorter 动态加载数据时,排序。过滤失效解决方案
解决方案:重置更新: $("table").trigger("update"); 1 官方 ajax表格数据添加实例: $(document).ready(fu ...
- 牛客 216D 消消乐 (二分图最小点覆盖)
大意: 给定棋盘, 每次消除一行或一列, 求最小次数使得消除完所有'*'. 裸的二分图最小点覆盖. 二分图的最小点覆盖等于最大匹配, 输出方案时从所有左部未盖点开始标记交替路上的点, 最后左部所有未标 ...
- Callable和Future的区别
Callable 在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口.然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果.我们一般只能采用共享变 ...
- 怎样创建一个独立于当前文档的新的Document对象
使用: document.implementation. 如下所示, 新创建的Document对象可以正常使用相关属性和方法, 然后将它的根节点与当前文档的根节点做一个替换. var doc = do ...
- hdu 3364 高斯入门。。
扣了一个高斯的介绍 比较全面(来自http://blog.csdn.net/duanxian0621/article/details/7408887) 高斯消元法,是线性代数中的一个算法,可用来求解线 ...
- 给datagrid一列中的数据加上单位
{ field:'computeRate', title:'完成百分比', width:100, align:'center', halign:'center', sortable:true, for ...
- webapi 之 post参数传递
最近在写webapi,在写post请求接口时遇到了不少的问题,在此记录下来. post请求的参数和get请求有点不一样,我们知道get请求的参数是通过url来传递的,而post请求则是通过http的请 ...
- java引用传递,值传递
2个interger的引用对象传给一个swap方法在方法内部进行交换 1.1 java中方法参数传值方式 java中方法传参数都是值传递的,只不过根据参数的类型是引用类型还是非引用类型 引用类型传递的 ...