登录 |  注册
首页 >  面试合集 >  Java面试宝典(第三部分·高级) >  MySQL问题排查都有哪些手段?

MySQL问题排查都有哪些手段?

MySQL排查问题常用思路

  • 使用 show processlist 命令查看当前所有连接信息。

  • 使用 explain 命令查询 SQL 语句执行计划。

  • 开启慢查询日志,查看慢查询的 SQL。

定制化 MySQL Show Processlist 输出结果

在 MySQL 中使用 Show Processlist 等指令时常常会出现一些无用信息,比如:Sleep 状态的。此时,如果我们想要过滤掉不需要的内容,应该怎么做呢?

方法一

在 MySQL 的命令提示符下,可以使用 \P 的命令设定要过滤的内容,步骤如下:

$ mysql -u root -p
$ mysql> \P grep -v Sleep
# 此时输出结果就没有 Sleep 相关的信息了
$ mysql> Show Full Processlist;

方法二

在使用 SQL 命令时想要过滤指定的内容,可以使用下面的命令。

SELECT * FROM information_schema.processlist WHERE STATE != '';
SELECT * FROM information_schema.processlist WHERE COMMAND != 'Sleep';
SELECT * FROM information_schema.processlist WHERE db = 'dbname' AND COMMAND != 'Sleep';

MySQL EXPLAIN 详解

MySQL EXPLAIN命令是查询性能优化不可缺少的一部分,本文主要讲解explain命令的使用及相关参数说明。
EXPLAIN Output Columns

mysql.jpg

id

id是用来顺序标识整个查询中SELELCT 语句的,在嵌套查询中id越大的语句越先执行。该值可能为NULL,如果这一行用来说明的是其他行的联合结果。

select_type

表示查询的类型

mysql.jpg

table

对应行正在访问哪一个表,表名或者别名

关联优化器会为查询选择关联顺序,左侧深度优先

当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列

当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id

注意:MySQL对待这些表和普通表一样,但是这些“临时表”是没有任何索引的。

type

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref。

possible_keys

显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的

key

key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 。

ref

ref列显示使用哪个列或常数与key一起从表中选择行。

rows

rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值。

Extra

Extra是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。

如何开启MySQL慢查询日志

参数说明:

slow_query_log  慢查询开启状态

slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)

long_query_time 查询超过多少秒才记录

log_output #输出方式,可以是file和table,当为file时会输出到slow_query_log_file文件,当为table时则会输出到mysql数据库中的slow_log表

操作步骤

正常情况下,只需要在配置文件中增加slow_query_log = 1配置,即打开慢查询日志,未指定slow_query_log_file的情况下,会自动生成一个以主机名+‘slow'.log 的文件。 

在 MySQL中,提供了慢查询查询日志,基于性能方面的考虑,该配置默认为OFF(关闭) 状态。那么如何开启慢日志查询呢?其步骤如下:

在 MySQL 中,慢查询日志默认为OFF状态,通过如下命令进行查看:

mysql> show variables like "slow_query_log";
+---------------------+----------------------------------------------+
| Variable_name       | Value                                        |
+---------------------+----------------------------------------------+
| slow_query_log      | OFF                                          |
+---------------------+----------------------------------------------+
2 rows in set (0.01 sec)

通过如下命令进行设置为 ON 状态:

set global slow_query_log = "ON";

其中slow_query_log_file属性,表示慢查询日志存储位置,其日志默认名称为 host 名称。

如下所示:

mysql> show variables like "slow_query_log_file";
+---------------------+----------------------------------------------+
| Variable_name       | Value                                        |
+---------------------+----------------------------------------------+                                     |
| slow_query_log_file | /usr/local/mysql/data/hostname.log |
+---------------------+----------------------------------------------+
2 rows in set (0.01 sec)

也可使用 以下命令进行修改:

set global slow_query_log_file = ${path}/${filename}.log;

其中: path 表示路径, filename 表示文件名,如果不指定,其默认filename 为hostname。

慢查询 查询时间,当SQL执行时间超过该值时,则会记录在slow_query_log_file 文件中,其默认为 10 ,最小值为 0,(单位:秒)。

mysql> show variables like "long_query_time";
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

可通过以下命令进行修改:

mysql> set global long_query_time = 5;

当设置值小于0时,默认为 0。

通过上述设置后,退出当前会话或者开启一个新的会话,执行如下命令:

select sleep(11);

备注: 这里的 11 并不是固定值,仅仅为了展示,其值只需要符合以下条件即可:

该值大于等于long_query_time 值即可。

该 SQL 则会进入慢查询日志中。通过cat 命令查看后如下所示:

# Time: 200310 13:30:57
# User@Host: root[root] @ localhost []  Id: 21528
# Query_time: 6.000164  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1583818257;
select sleep(6);
上一篇: 说一下乐观锁和悲观锁?
下一篇: MySQL的性能优化经验
推荐文章
  • 在HTML中,如果你想让一个输入框(input元素)不可编辑,你可以通过设置其readonly属性来实现。示例如下:input type="text" value="此处内容不可编辑" readonly在上述代码中,readonly属性使得用户无法修改输入框中的内容。另外,如果你希望输入框完全不可交
  • ASP.NET教程ASP.NET又称为ASP+,基于.NETFramework的Web开发平台,是微软公司推出的新一代脚本语言。ASP.NET是一个使用HTML、CSS、JavaScript和服务器脚本创建网页和网站的开发框架。ASP.NET支持三种不一样的开发模式:WebPages(Web页面)、
  • C# 判断判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的通常形式:判断语句C#提供了以下类型的判断语句。点击链接查看每个语句的细节。语句描述if语句一个 if语句 由一个布尔表达式后跟
  • C#循环有的时候,可能需要多次执行同一块代码。通常情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。编程语言提供了允许更为复杂的执行路径的多种控制结构。循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的通常形式:循环类型C#提供了以下几种循环类型
  • C#数组(Array)数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,一般认为数组是一个同一类型变量的集合。声明数组变量并不是声明number0、number1、...、number99一个个单独的变量,而是声明一个就像numbers这样的变量,然后使用numbers[0]
  • ASP.NET是一个由微软公司开发的用于构建Web应用程序的框架,它是.NETFramework的一部分。它提供了一种模型-视图-控制器(MVC)架构、Web表单以及最新的ASP.NETCore中的RazorPages等多种开发模式,可以用来创建动态网页和Web服务。以下是一些基础的ASP.NET编
学习大纲