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%';

运行结果:

mysql慢查询解决方法_第1张图片

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;

运行结果:
mysql慢查询解决方法_第2张图片

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

show profile cpu,block io for query 12

运行结果
mysql慢查询解决方法_第3张图片
这里只列出了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   :存在锁

如下:
mysql慢查询解决方法_第4张图片
Creating tmp table ,Copy to tmp table,removing tmp table 当然会慢了

四,sql优化

SQL语句优化

你可能感兴趣的:(mysql,mysql,数据库,sql)