mysql 慢查询

Posted 雪剑无影

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 慢查询相关的知识,希望对你有一定的参考价值。

开启慢查询日志

在配置文件my.cnf或my.ini中在 [mysqld] 一行下面加入两个配置参数

slow_query_log = on     #开启慢查询
long_query_time=1       #设置慢查询时间 1 s
slow_query_log_file="D:/phpStudy/MySQL/data/slow_query.log"    #慢查询日志保存路径 未指定slow_query_log_file的情况下,会自动生成一个以主机名+‘slow‘.log 的文件
log-queries-not-using-indexes = on   #开启记录没有使用索引查询语句

 

sql 查看慢查询配置

show status like slow_queries;    #慢查询的次数 (默认是慢查询时间10s)
show variables like long_query_time ;   //可以显示当前慢查询时间
set long_query_time=1 ;    //可以修改慢查询时间 当前会话有效,永久有效请修改配置文件

 

慢查询记录到日志

在默认情况下,低版本的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以

binmysqld.exe –log-slow-queries=D:/abc.log [低版本mysql5.0可以在my.ini指定]

该慢查询日志在mysql5.0这个版本中时放在 mysql安装目录/data/下;

针对 mysql5.5启动慢查询有两种方法

  ① binmysqld.exe - -safe-mode - -slow-query-log

  ②在my.ini 文件中配置 [mysqld] 添加slow-query-log = on # 开启慢查询这个功能

可以通过  slow_query_log_file="日志存放位置"指定目录,默认存放在 mysql5.5.19是在my.ini 的 datadir=“目录” ;

在mysql5.6中,默认是启动记录慢查询的,my.ini其中有一个配置项 slow-query-log=1;

 

慢查询sql语句explain分析

Explain sql语句;

会产生如下信息:

id: 这是SELECT的查询序列号

select_type: 表示查询的类型。

SIMPLE 简单的 select 查询,不使用 union 及子查询
PRIMARY 最外层的 select 查询
UNION UNION 中的第二个或随后的 select 查询,不 依赖于外部查询的结果集
DEPENDENT UNION UNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集
SUBQUERY 子查询中的第一个 select 查询,不依赖于外 部查询的结果集
DEPENDENT SUBQUERY 子查询中的第一个 select 查询,依赖于外部 查询的结果集
DERIVED 用于 from 子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里。
UNCACHEABLE SUBQUERY 结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估。
UNCACHEABLE UNION UNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询

table: 输出结果集的表

type: 表示表的连接类型  

system           表仅有一行(=系统表)。这是 const 连接类型的一个特例。
const const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System。
eq_ref const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System。
ref 连接不能基于关键字选择单个行,可能查找 到多个符合条件的行。 叫做 ref 是因为索引要 跟某个参考值相比较。这个参考值或者是一 个常数,或者是来自一个表里的多表查询的 结果值。
ref_or_null 如同 ref, 但是 MySQL 必须在初次查找的结果 里找出 null 条目,然后进行二次查找。
index_merge 说明索引合并优化被使用了。
unique_subquery 在某些 IN 查询中使用此种类型,而不是常规的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery 在 某 些 IN 查 询 中 使 用 此 种 类 型 , 与 unique_subquery 类似,但是查询的是非唯一 性索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
range 只检索给定范围的行,使用一个索引来选择 行。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可 以使用 range。
index 全表扫描,只是扫描表的时候按照索引次序 进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。
all 最坏的情况,从头到尾全表扫描。

possible_keys: 表示查询时,可能使用的索引

key: 表示实际使用的索引

key_len: 索引字段的长度

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows: 扫描出的行数(估算的行数)

Extra: 执行情况的描述和说明

No tables :Query语句中使用FROM DUAL 或不含任何FROM子句

Using filesort :当Query中包含 ORDER BY 操作,而且无法利用索引完成排序,

Impossible WHERE noticed after reading const tables: MYSQL Query Optimizer

通过收集统计信息不可能存在结果

Using temporary:某些操作必须使用临时表,常见 GROUP BY ; ORDER BY

Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据;

 

注意:条件是一个范围值(所谓 range),即 range 类型查询字段后面的索引无效。

     当order by 的字段在  where 条件中出现 况且 字段有固定值 或者 有固定返回时  会用到字段的索引。

 慢查询相关命令

mysql> show variables like %slow%;
+---------------------+---------------------------------------+
| Variable_name       | Value                                 |
+---------------------+---------------------------------------+
| log_slow_queries    | OFF                                   |
| slow_launch_time    | 2                                     |
| slow_query_log      | OFF                                   |
| slow_query_log_file | D:phpStudyMySQLdataAdmin-slow.log |
+---------------------+---------------------------------------+
mysql> show variables like %long%;
+---------------------------------------------------+-----------+
| Variable_name                                     | Value     |
+---------------------------------------------------+-----------+
| long_query_time                                   | 10.000000 |
| max_long_data_size                                | 1048576   |
| performance_schema_events_waits_history_long_size | 10000     |
+---------------------------------------------------+-----------+
mysql> show variables like %min%;
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| ft_min_word_len          | 4     |
| min_examined_row_limit   | 0     |
| query_cache_min_res_unit | 4096  |
+--------------------------+-------+

 


以上是关于mysql 慢查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库插入数据很慢

Logstash分析MySQL慢查询日志

MySQL慢查询日志分析

什么是慢查询?

开启mysql慢查询日志并使用mysqldumpslow命令查看

MySQL 8.0.15 大坝慢选查询