mysql慢查询解决方法

转载以下文章

MySQL开启慢查询日志
MySQL Explain详解
show profile查看SQL执行生命周期

一,启动慢查询日志

开启慢日志只适应于小的项目、项目未上线或者紧急情况,因为一旦开启慢日志查询会增加数据库的压力。所以一般采用后台对数据操作时间写入日志文件中,每一周定时进行清除日志。

参数说明:

slow_query_log 慢查询开启状态,ON开启,OFF关闭
slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)
long_query_time 查询超过多少秒才记录

查看是否已经开启了慢查询

show variables like 'slow_query%';

运行结果:

在这里插入图片描述

show variables like 'long_query_time';

运行结果:
在这里插入图片描述
默认查询超过10秒才记录

启用慢查询

1,全局变量设置(该方式数据库重启全部失效,得重新配置)

# 将 slow_query_log 全局变量设置为“ON”状态
set global slow_query_log='ON'; 
# 设置慢查询日志存放的位置
set global slow_query_log_file='/usr/local/mysql/data/slow.log'; 
# 设置查询超过1秒就记录(如果有时候用命令不起作用,那么可以关闭再打开)
set global long_query_time=1;

2,修改my.cnf配置文件(服务器重启不影响)

修改配置文件my.cnf,在[mysqld]下的下方加入

slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log     //linux
long_query_time = 1

重启MySQL服务

service mysqld restart

二,分析慢查询sql

explain 查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描

explain select * from emp where name = 'Jefabc';

运行结果:
在这里插入图片描述

id 选择标识符
select_type 表示查询的类型。
table 输出结果集的表
partitions 匹配的分区
type 表示表的连接类型
possible_keys 表示查询时,可能使用的索引
key 表示实际使用的索引
key_len 索引字段的长度
ref 列与索引的比较
rows 扫描出的行数(估算的行数)
filtered 按表条件过滤的行百分比
Extra 执行情况的描述和说明

select_type查询的类型,是单表查询、联合查询、子查询等

SIMPLE 简单SELECT,不使用UNION或子查询等
PRIMARY 子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY
UNION UNION中的第二个或后面的SELECT语句
DEPENDENT UNION UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT UNION的结果,union语句中第二个select开始后面所有select
SUBQUERY 子查询中的第一个SELECT,结果不依赖于外部查询
DEPENDENT SUBQUERY 子查询中的第一个SELECT,依赖于外部查询
DERIVED 派生表的SELECT, FROM子句的子查询
UNCACHEABLE SUBQUERY 一个子查询的结果不能被缓存,必须重新评估外链接的第一行

type 对表访问方式

从最优到最差的排序:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all。

ALL 遍历全表以找到匹配的行
index 遍历索引树
range 只检索给定范围的行,使用一个索引来选择行
ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
eq_ref 类似ref,区别就在使用的索引是唯一索引 primary key或者 unique
const、system 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
NULL MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

possible_keys 可能使用的索引

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)

Key 实际使用的索引

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中

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

三,Show Profile进行sql分析

1.Show Profile是什么

是mysql提供的用来分析当前会话中sql执行的资源消耗情况,比explain粒度更细的sql调优手段。默认关闭状态,并保存最近15次运行结果。

2.查看该参数是否开启以及如何开启

1,查看是否已经开启

show  VARIABLES like 'profiling';

运行结果:
在这里插入图片描述
2.开启 Profile,默认是关闭的,现在开启。

set profiling = 1;

3.使用Profile

1,执行一边慢sql

select * from emp group by id%10;
select * from emp group by id%20 order by 5;

2,执行一下sql

show profiles;

运行结果:
在这里插入图片描述

3,诊断SQL,查看CUP使用情况,格式: show profile cpu,block io for query [Query_ID]

show profile cpu,block io for query 12

运行结果
在这里插入图片描述
这里只列出了cpu和 block io 当然 诊断类型不止这些,常用的cpu和block io

ALL 显示所有的开销信息
BLOCK IO 显示块IO相关开销
CONTEXT SWITCHES 上下文切换相关开销
CPU  显示CPU相关开销信息
IPC  显示发送和接收相关开销信息
MEMORY 显示内存相关开销信息
PAGE FAULTS 显示页面错误相关开销
SOURCE  显示和Source_function,Source_file,Source_line相关的开销信息
SWAPS   显示交换次数相关开销的信息

Status 出现以下4个就会出现很大问题:

converting HEAP to MyISAM :查询结果太大,内存都不够用了往磁盘上搬
Creating tmp table : 创建临时表,拷贝数据到临时表,用完再删除
Copy to tmp table on disk : 把内存中临时表赋值到磁盘,很危险
locked   :存在锁

如下:
在这里插入图片描述
Creating tmp table ,Copy to tmp table,removing tmp table 当然会慢了

四,sql优化

SQL语句优化

猜你喜欢

转载自blog.csdn.net/fangye1/article/details/114087488