深入精通Mysql系列其他文章推荐:

从本系列第一篇《深入精通Mysql(一)》系列之Mysql整体架构和sql执行过程我们就可以知道一条sql语句的执行过程会经过优化器进行优化。

优化器就是对我们的 SQL 语句进行分析,生成执行计划。

问题:在我们做项目的时候,有时会收到 DBA 的邮件,里面列出了我们项目上几个耗时比较长的查询语句,让我们去优化,这些语句是从哪里来的呢?

我们的服务层每天执行了这么多 SQL 语句,它怎么知道哪些 SQL 语句比较慢呢?

第一步,我们要把 SQL 执行情况记录下来。

1.1 慢查询日志 slow query log

1.1.1 打开慢日志开关

因为开启慢查询日志是有代价的(跟 bin log、optimizer-trace 一样),所以它默认是关闭的:

show variables like 'slow_query%';

除了这个开关,还有一个参数,控制执行超过多长时间的 SQL 才记录到慢日志,默认是 10 秒。

show variables like '%slow_query%';

可以直接动态修改参数(重启后失效)。

set @@global.slow_query_log=1;

set @@global.long_query_time=3;

​show variables like '%long_query%';-- 1 开启, 0 关闭, 重启后失效

-- mysql 默认的慢查询时间是 10 秒, 另开一个窗口后才会查到最新值

show variables like '%slow_query%';

或者修改配置文件 my.cnf。

以下配置定义了慢查询日志的开关、慢查询的时间、日志文件的存放路径。

slow_query_log = ON

long_query_time=2

slow_query_log_file =/var/lib/mysql/localhost-slow.log

模拟慢查询:

select sleep(10);

查询 user_innodb 表的 500 万数据(检查是不是没有索引)。

SELECT * FROM `user_innodb` where phone = '136';

4.1.2 慢日志分析

1、 日志内容

show global status like 'slow_queries'; -- 查看有多少慢查询

show variables like '%slow_query%'; -- 获取慢日志目录

--日志路径

cat /var/lib/mysql/ localhost-slow.log日志内容有了慢查询日志,怎么去分析统计呢?

比如 SQL 语句的出现的慢查询次数最多,平均每次执行了多久?

2、 mysqldumpslow

MySQL 提供了 mysqldumpslow 的工具,在 MySQL 的 bin 目录下。

mysqldumpslow --help

例如:查询用时最多的 20 条慢 SQL:

mysqldumpslow -s t -t 20 -g 'select' /var/lib/mysql/localhost-slow.log

Count代表这个 SQL 执行了多少次;

Time代表执行的时间,括号里面是累计时间;

Lock表示锁定的时间,括号是累计;

Rows表示返回的记录数,括号是累计。

除了慢查询日志之外,还有一个SHOW PROFILE 工具可以使用。

4.2 SHOW PROFILE

SHOW PROFILE 是谷歌高级架构师 Jeremy Cole 贡献给 MySQL 社区的,可以查看SQL 语句执行的时候使用的资源,比如 CPU、IO 的消耗情况。

在 SQL 中输入 help profile 可以得到详细的帮助信息。

4.2.1 查看是否开启

select @@profiling;

set @@profiling=1;

4.2.2 查看 profile 统计

(命令最后带一个 s)

show profiles;

查看最后一个 SQL 的执行详细信息,从中找出耗时较多的环节(没有 s)。

show profile;

6.2E-5,小数点左移 5 位,代表 0.000062 秒。

也可以根据 ID 查看执行详细信息,在后面带上 for query + ID。

show profile for query 1;

除了慢日志和 show profile,如果要分析出当前数据库中执行的慢的 SQL,还可以通过查看运行线程状态和服务器运行信息、存储引擎信息来分析。

4.2.3 其他系统命令

show processlist 运行线程

show processlist;

这是很重要的一个命令,用于显示用户运行线程。可以根据 id 号 kill 线程。 也可以查表,效果一样:

select * from information_schema.processlist;

show status 服务器运行状态

SHOW STATUS 用于查看 MySQL 服务器运行状态(重启后会清空),有 session和 global 两种作用域,格式:参数-值。

可以用 like 带通配符过滤。

SHOW GLOBAL STATUS LIKE 'com_select'; -- 查看 select 次数

show engine 存储引擎运行信息

show engine 用来显示存储引擎的当前运行信息,包括事务持有的表锁、行锁信息;事务的锁等待情况;线程信号量等待;文件 IO 请求;buffer pool 统计信息。

例如:

show engine innodb status;

如果需要将监控信息输出到错误信息 error log 中(15 秒钟一次),可以开启输出。

show variables like 'innodb_status_output%';

-- 开启输出:

SET GLOBAL innodb_status_output=ON;

SET GLOBAL innodb_status_output_locks=ON;

我们现在已经知道了这么多分析服务器状态、存储引擎状态、线程运行信息的命令,如果让你去写一个数据库监控系统,你会怎么做?

其实很多开源的慢查询日志监控工具,他们的原理其实也都是读取的系统的变量和状态。

现在我们已经知道哪些 SQL 慢了,为什么慢呢?慢在哪里?

MySQL 提供了一个执行计划的工具(在架构中我们有讲到,优化器最终生成的就是一个执行计划),其他数据库,例如 Oracle 也有类似的功能。

通过 EXPLAIN 我们可以模拟优化器执行 SQL 查询语句的过程,来知道 MySQL 是

怎么处理一条 SQL 语句的。通过这种方式我们可以分析语句或者表的性能瓶颈。

explain 可以分析 update、delete、insert 么?

MySQL 5.6.3以前只能分析 SELECT;

MySQL5.6.3以后就可以分析update、delete、insert 了。

我们将在下一篇文章为大家带来EXPLAIN 执行计划详解。

深入精通Mysql系列其他文章推荐:

Mysql慢查询深入剖析_《深入精通Mysql(六)》系列之如何通过慢查询日志进行SQL分析和优化...相关推荐

  1. mysql内连接部门平均值_详解MySql基本查询、连接查询、子查询、正则表达查询_MySQL...

    查询数据指从数据库中获取所需要的数据.查询数据是数据库操作中最常用,也是最重要的操作.用户可以根据自己对数据的需求,使用不同的查询方式.通过不同的查询方式,可以获得不同的数据.MySQL中是使用SEL ...

  2. mysql update 几万 非常慢_如何解决mysql 查询和更新速度慢

    在做客户关系管理系统的时候遇到联表查询,速度特别慢,导致页面加载时间过长而出现错误.在上网查询后发现建立索引可以优化查询 在没有建立索引的时候 select c.*,s.* from crm_cu_r ...

  3. mysql慢查询检查流程_简单谈谈MySQL优化利器-慢查询

    慢查询 首先,无论进行何种优化,开启慢查询都算是前置条件.慢查询机制,将记录过慢的查询语句(事件),从而为DB维护人员提供优化目标. 检查慢查询是否开启 通过show variables like ' ...

  4. php mysql查询中文乱码_解决php mysql查询插入中文乱码问题_PHP教程

    解决php mysql查询插入中文乱码问题 一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那 ...

  5. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  6. mysql获得每条记录_如何在MySQL查询结果集中得到每条记录的行号

    如果需要在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号, ISO SQL:2003 标准提出的方法是提供 ROW_NUMBER() / RANK() 函数. Oracle 中可以使用标准 ...

  7. mysql 跳表 b 树_简单谈谈Mysql索引与redis跳表

    摘要 面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别.这种一看就知道是死记硬背,没有理解索引的本质.本文旨在剖析这 ...

  8. mysql动力节点百度云_动力节点MySQL数据库视频 百度云 网盘 下载

    资源名称:动力节点MySQL数据库视频 百度云 网盘 下载 # o4 E. q% ]2 ?百度网盘下载链接:[/hide]- t4 L+ S# b2 T( }! d) n& d 密码:dff7 ...

  9. mysql支持的并发数_重学MySQL系列(五):谈谈对MySQL的存储引擎的理解

    原创作者,公众号[程序员读书],欢迎关注公众号,转载文章请注明出处哦. MySQL关于存储引擎的架构设计,相较于其他关系数据库管理系统,比如Oracle,SQL Server等数据库,这是MySQL最 ...

最新文章

  1. 计算机视觉黑魔法 | 16个案例
  2. 死磕java并发cas_死磕Java——CAS
  3. struts2.0标签库
  4. 有轻功:用3行代码让Python数据处理脚本获得4倍提速
  5. @ModelAttribute使用详解
  6. IOS开发之MVC模式的介绍
  7. qt UI design tips
  8. selenium简介_什么是Selenium? Selenium简介
  9. jfreechart柱状图java mysql_时序时空数据库MySQL再升级,兼容MySQL协议
  10. Java_单例/多例设计
  11. 《深入浅出通信原理》学习(1-8)
  12. 网络上复制网页文字的方法
  13. 网络爬虫---微信爬虫
  14. sap服务器安装双系统教程,电脑安装双系统图文教程
  15. LeaRun敏捷开发框架快速设计表单
  16. 如何在自己行业内放大和增加收入
  17. 9.4 双向深度循环神经网络
  18. DSA815频谱分析仪技术参数
  19. 音乐分享网站(JavaSSH)
  20. Spring Security OAuth2 实现使用JWT

热门文章

  1. sklearn(聚类和降维)
  2. 三十七、细说Scrapy中的settings设置
  3. 锂电池放空后充不进电_锂电池过度放电后充不进电怎么办
  4. vue不是内部或外部命令
  5. mysql 一次性导入数据库_Mysql 一次性备份导出/导入恢复所有数据库
  6. Vuex——命名空间导致错误[unknown action type:XXX]解决方案
  7. html5 将资源存于客户端,HTML5离线应用与客户端存储的实现
  8. Hive hiveserver2 配置运行
  9. hbase shelljava 获取多版本的值
  10. JSP自定义标签 函数,实现生日计算年龄