Mysql优化_内置profiling性能分析工具
如果要进行SQL的调优优化和排查,第一步是先让故障重现,但是这个并不是这一分钟有问题,下一秒就OK。
一般的企业一般是DBA数据库工程师从监控里找到问题。DBA会告诉我们让我们来排查问题,那么可能很多种原因,也许是程序内存泄漏、也许是网络、也许是死锁、也许是SQL写的烂。假设是SQL问题我们需要把SQL抓出,一般就是在测试环境跑一下SQL,重现故障。首先打开我们的慢查询日志,这样把有问题的SQL排查出来,然后用EXPLAIN分析一下,一般到了这一步应该会找到相应问题所在。但是如果还是没有解决,SQL在传输网络、链接、是否是死锁等各方面都再有一个更加详细的排查,那么show profile就可以帮忙解决了。
差不多到了这,基本上95%的问题解决了,那么最后如果通过前面问题的分析,解决的问题还是一般般,那么就需要配合DBA看看mysql配置文件各方面的参数节点配置进行调优了。
show profile是什么?是Mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优测量。
默认情况下参数处于关闭状态,开启后保存最近15次的运行结果。
假设一条SQL执行完成之后,10秒钟,这么慢,那么能不能有一张清单告诉你你到底是多少个步骤,比如第一步花了1.34秒,第二步花了2.44秒...累积达到10秒,show profile就有这样的功能。
SQL导致服务器慢要么就是CPU运算复杂要么就是频繁IO。
MySQL 的 Query Profiler 是一个使用非常方便的 Query 诊断分析工具,通过该工具可以获取一条Query 在整个执行过程中多种资源的消耗情况,如 CPU,IO,IPC,SWAP 等,以及发生的 PAGE FAULTS,CONTEXT SWITCHE 等等,同时还能得到该 Query 执行过程中 MySQL 所调用的各个函数在源文件中的位置。
MySQL [test_db]> show variables like '%profiling%'; //查看是否开启
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| have_profiling | YES |
| profiling | ON |
| profiling_history_size | |
+------------------------+-------+
MySQL [test_db]> set profiling=on; //开启show profiling
Query OK, rows affected, warning (0.00 sec)
reset cache query; //清空SQL缓存
select * from table where... order by desc limit ,; //执行SQL
show profiles; //获取系统中保存的所有query的profile概要信息
MySQL [test_db]> show profiles;
+----------+------------+-------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------------------------------------+
| | 0.00099825 | select * from emp order by id desc limit , |
| | 0.00004150 | select * from emp order by id desc limit , |
| | 0.00007300 | select * from emp order by id desc limit , |
| | 0.00010325 | select * from emp order by id desc limit , |
| | 0.00011000 | select * from emp order by id desc limit , |
| | 0.00007025 | select * from emp order by id desc limit , |
| | 0.00005275 | select * from emp order by id desc limit , |
| | 0.00004050 | select * from emp order by id desc limit , |
| | 0.00009000 | select * from emp order by id desc limit , |
| | 0.10676625 | select * from emp order by id desc limit , |
| | 7.02310450 | select * from emp order by id desc limit |
| | 3.90775625 | select * from emp order by id desc limit |
| | 2.96361950 | select * from emp order by id desc limit |
| | 0.19119000 | set profiling= |
| | 0.10549050 | select count(*) from emp |
+----------+------------+-------------------------------------------------+
三列分别是查询ID,执行时间,执行SQL
在获取到概要信息之后,就可以根据概要信息中的 Query_ID 来获取某个 Query 在执行过程中,以19为例
MySQL [test_db]> show profile cpu,block io for query ;
MySQL [test_db]> MySQL [test_db]> show profile cpu,block io for query ;
+--------------------------------+----------+----------+------------+--------------+---------------+
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+--------------------------------+----------+----------+------------+--------------+---------------+
| starting | 0.000037 | 0.000000 | 0.000000 | | | //开始连接
| Waiting for query cache lock | 0.000002 | 0.000000 | 0.000000 | | | //找缓存
| starting | 0.000001 | 0.000000 | 0.000000 | | |
| checking query cache for query | 0.104519 | 0.000000 | 0.001000 | | |
| checking permissions | 0.000011 | 0.000000 | 0.000000 | | | //验证权限
| Opening tables | 0.000014 | 0.000000 | 0.000000 | | |
| init | 0.000787 | 0.000000 | 0.000000 | | |
| System lock | 0.000017 | 0.000000 | 0.000000 | | |
| Waiting for query cache lock | 0.000002 | 0.000000 | 0.000000 | | |
| System lock | 0.000013 | 0.000000 | 0.000000 | | |
| optimizing | 0.000010 | 0.000000 | 0.000000 | | |
| executing | 0.000009 | 0.000000 | 0.000000 | | |
| end | 0.000003 | 0.000000 | 0.000000 | | |
| query end | 0.000005 | 0.000000 | 0.000000 | | |
| closing tables | 0.000031 | 0.000000 | 0.000000 | | |
| freeing items | 0.000010 | 0.000000 | 0.000000 | | |
| Waiting for query cache lock | 0.000001 | 0.000000 | 0.000000 | | |
| freeing items | 0.000013 | 0.000000 | 0.000000 | | |
| Waiting for query cache lock | 0.000001 | 0.000000 | 0.000000 | | |
| freeing items | 0.000001 | 0.000000 | 0.000000 | | |
| storing result in query cache | 0.000003 | 0.000000 | 0.000000 | | |
| cleaning up | 0.000002 | 0.000000 | 0.000000 | | |
+--------------------------------+----------+----------+------------+--------------+---------------+
上面结果显示了完整的生命周期过程。
如果出现以下四种情况之一,那么就有问题!
converting HEAP to MyISAM查询结果太大,内存不够用了往磁盘上搬了。
Creating tmp table 创建了临时表,拷贝数据到临时表,用完再删除
Copying to tmp table on disk ,把内存中临时表复制到磁盘,很危险!
locked,锁了。
Mysql优化_内置profiling性能分析工具的更多相关文章
- Mysql内置的profiling性能分析工具
要想优化一条 Query,我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里,是消耗的 CPU计算太多,还是需要的的 IO 操作太多?要想能够清楚的了解这些信息,在 MySQL 5.0 和 M ...
- Mysql自带profiling性能分析工具使用分享
1. show variables like '%profiling%';(查看profiling信息) 2. set profiling=1;(开启profiling) 3. 执行S ...
- Java 性能分析工具 , 第 1 部分: 操作系统工具
引言 性能分析的前提是将应用程序内部的运行状况以及应用运行环境的状况以一种可视化的方式更加直接的展现出来,如何来达到这种可视化的展示呢?我们需要配合使用操作系统中集成的程序监控工具和 Java 中内置 ...
- Java 性能分析工具 , 第 2 部分:Java 内置监控工具
引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...
- Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解
Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解 Mysql慢查询开启 Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应 ...
- 向mysql中批量插入数据的性能分析
MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下 CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...
- Mysql优化_第十三篇(HashJoin篇)
Mysql优化_第十三篇(HashJoin篇) 目录 Mysql优化_第十三篇(HashJoin篇) 1 适用场景 纯等值查询,不能使用索引 等值查询,使用到索引 多个join条件中至少包含一个等值查 ...
- paip.提升性能---mysql 优化cpu多核以及lan性能的关系.
paip.提升性能---mysql 优化cpu多核以及lan性能的关系. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:/ ...
- mysql中的内置函数
这里主要介绍mysql丰富的内置函数. 数学函数 数学函数相对比较简单,就是涉及一些数值的计算,这里列出数学函数的功能,仅个别给出实例. 函数 作 用 ABX(x) 返回x的绝对值 CEIL(X),C ...
随机推荐
- 什么是安全散列算法SHA256?
安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1.SHA-224.S ...
- PHP之文件上传
1.$_FILES['myFile']['name'] 上传文件的原始名称 2.$_FILES['myFIle']['type'] 上传文件的mime-type 3.$_FILES['myFile'] ...
- PHP程序员应该知道的15个库
最几年,PHP已经成为最受欢迎的一种有效服务器端编程语言.据2013年发布的一份调查报告显示,PHP语言已经被安装在全球超过2.4亿个网站以及210万台Web服务器之上.PHP代表超文本预处理器,它主 ...
- postgreSQL 自增需要使用序列
postgreSQL 自增需要使用序列 1.使用SERIAL CREATE TABLE users ( id SERIAL4 primary key , name character varying, ...
- 安装crf++的python包
在Linux上可以在taku910的github博客(https://taku910.github.io/crfpp/)下载crf++的linux版本,然后按照python文件夹下的README编译安 ...
- 【python-opencv】15-图像阈值
[微语]立志要如山,行道要如水.不如山,不能坚定,不如水,不能曲达 import cv2 as cv import numpy as np from matplotlib import pyplot ...
- 集成RabbitMQ做秒杀
由于秒杀的并发量太大,所以仅仅使用缓存是不够的,还需要用到RabbitMQ. 这里推荐一款用于分库分表的中间件:mycat 解决超卖的问题(看第五章节): 秒杀接口优化: 实操: 然后把下载好的文件上 ...
- [svc]ftp协议数据连接的2种模式
玩明白了以太网2的二层数据格式, ip格式 tcp/udp个时候, 需要玩一玩一些有用的基于这些已上的协议数据了. 如 dhcp ftp等.比较有趣. ftp协议 分控制连接21端口 和数据连接 20 ...
- weka数据挖掘拾遗(二)---- 特征选择(IG、chi-square)
一.说明 IG是information gain 的缩写,中文名称是信息增益,是选择特征的一个很有效的方法(特别是在使用svm分类时).这里不做详细介绍,有兴趣的可以googling一下. chi-s ...
- print(array)时array中间是省略号没有输出全部的解决方法
import numpy as np np.set_printoptions(threshold=np.inf) 大量元素情况 可以采用set_printoptions(threshold='nan' ...