我们经常会接触到MySQL,也经常会遇到一些MySQL的性能问题。我们可以借助慢查询日志和explain命令初步分析出SQL语句存在的性能问题

通过SHOW FULL PROCESSLIST查看问题

SHOW FULL PROCESSLIST相当于select * from information_schema.processlist可以列出正在运行的连接线程,

processlist

说明:id 连接id,可以使用kill+连接id的方式关闭连接(kill 9339)

user显示当前用户

host显示连接的客户端IP和端口

db显示进程连接的数据库

command显示当前连接的当前执行的状态,sleep、query、connect

time显示当前状态持续的时间(秒)

state显示当前连接的sql语句的执行状态,copying to tmp table、sorting result、sending data等

info显示sql语句,如果发现比较耗时的语句可以复制出来使用explain分析。

慢查询日志

慢查询日志是MySQL用于记录响应时间超过设置阈值(long_query_time)的SQL语句,默认情况下未开启慢查询日志,需要手动配置。

下面我们要记住几个常用的属性:slow_query_log:是否开启慢查询(ON为开启,OFF则为关闭)

long_query_time:慢查询阀值,表示SQL语句执行时间超过这个值就会记录,默认为10s

slow_query_log_file:慢查询日志存储的文件路径

log_queries_not_using_indexes: 记录没有使用索引查询语句(ON为开启,OFF为关闭)

log_output:日志存储方式(FILE表示将日志写入文件,TABLE表示写入数据库中,默认值为FILE,如果存入数据库中,我们可以通过select * from mysql.slow_log的方式去查询,一般性能要求相对较高的建议存文件)

我们可以通过show variables like ‘%关键字%’的方式查询我们设置的属性值

slow

我们有两种方式设置我们的属性,一种是set global 属性=值的方式(重启失效),另一种是配置文件(重启生效)

命令方式:

set global slow_query_log=1;

set global long_query_time=1;

set global slow_query_log_file='mysql-slow.log'

配置文件方式:

slow_query_log = 'ON'

slow_query_log_file = D:/Tools/mysql-8.0.16/slow.log

long_query_time = 1

log-queries-not-using-indexes

pt-qurey-digest分析慢查询语句

percona-toolkit包含了很多实用强大的mysql工具包,pt-qurey-digest只是其中一个用于分析慢查询日志是工具。需要去官网下载,使用方法也很简单:

./pt-query-digest slow2.log >> slow2.txt

即可得出一个分析结果:

# Query 9: 0.00 QPS, 0.00x concurrency, ID 0xF914D8CC2938CE6CAA13F8E57DF04B2F at byte 499246

# This item is included in the report because it matches --limit.

# Scores: V/M = 0.22

# Time range: 2019-07-08T03:56:12 to 2019-07-12T00:46:28

# Attribute pct total min max avg 95% stddev median

# ============ === ======= ======= ======= ======= ======= ======= =======

# Count 8 69

# Exec time 1 147s 1s 3s 2s 3s 685ms 2s

# Lock time 0 140ms 2ms 22ms 2ms 3ms 2ms 2ms

# Rows sent 0 0 0 0 0 0 0 0

# Rows examine 0 23.96M 225.33k 482.77k 355.65k 462.39k 81.66k 345.04k

# Query size 2 17.72k 263 263 263 263 0 263

# String:

# Databases xxxx

# Hosts xx.xxx.xxx.xxx

# Users root

# Query_time distribution

# 1us

# 10us

# 100us

# 1ms

# 10ms

# 100ms

# 1s ################################################################

# 10s+

# Tables

# SHOW TABLE STATUS FROM `xxxx` LIKE 'xxxxx_track_exec_channel'G

# SHOW CREATE TABLE `xxxx`.`xxxxxxxx_exec_channel`G

# SHOW TABLE STATUS FROM `xxx` LIKE 'xxxxx_TRACK_ASSIGN'G

# SHOW CREATE TABLE `xxxx`.`xxxxx_EFFECTIVE_TRACK_ASSIGN`G

# SHOW TABLE STATUS FROM `xxx` LIKE 'xxxx_task_exec'G

# SHOW CREATE TABLE `xxxx`.`xxxxx_task_exec`G

UPDATExxxxxx_effective_track_exec_channel a

SET EXEC_CHANNEL_CODE=(SELECT GROUP_CONCAT(DISTINCT(channel_id)) FROM xxxxxx_EFFECTIVE_TRACK_ASSIGN WHERE status in (1,2,4) AND id IN (SELECT assgin_id FROM xxxxxx_task_exec WHERE task_id=a.task_id))G

explain分析SQL语句

上面几点大概的介绍到了几种获取慢查询SQL语句的方式,现在,我们就需要借助explain来分析查找SQL语句慢的原因。explain使用也很简单,直接在SELECT|UPDATE等语句前加上EXPLAIN即可

explain

id

表的执行顺序,复制的sql语句往往会分为很多步,序号越大越先执行,id相同执行顺序从上往下

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(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

table

数据来源于那张表,关联等复杂查询时会用临时虚拟表

type

检索数据的方式system:表只有一行记录

const:通过索引查找并且一次性找到

eq_ref:唯一性索引扫描

ref:非唯一行索引扫描

range:按范围查找

index:遍历索引树

all:全表扫描

possible_keys

显示可能使用的索引

Key

实际使用的索引

key_len

索引的长度,一般来说,长度越短越好

ref

列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows

估算查找的结果记录条数

Extra

SQL查询的详细信息Using where:表示使用where条件过滤

Using temporary:使用了临时表暂存结果

Using filesort:说明mysql对数据使用一个外部索引排序。未按照表内的索引顺序进行读取。

Using index:表示select语句中使用了覆盖索引,直接从索引中取值

Using join buffer:使用了连接缓存

Using index condition:表示查询的列有非索引的列

[参考]

MySQL Explain详解

mysql慢查询开启语句分析_mysql慢查询语句分析总结相关推荐

  1. mysql 慢查询日志的作用_MySQL慢查询日志的作用和开启

    前言 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.lon ...

  2. mysql 查询指定字段数据_MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...

  3. mysql执行sql语句按钮_mysql执行sql语句过程

    开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库 ...

  4. mysql慢查询记录到表_MySQL慢查询记录原理和内容解析

    原标题:MySQL慢查询记录原理和内容解析 作者:高鹏(网名八怪),<深入理解MySQL主从原理32讲>系列文的作者. 本文为学习记录,可能有误请谅解,也提供了一些源码接口供有兴趣的朋友调 ...

  5. 在mysql怎样查询地址和电话_Mysql数据查询

    Mysql查询 数据多次过滤 条件:from.where.group by.having.distinct.order by.limit => 层层筛选后的结果 查: select [disti ...

  6. mysql索引优化分析_MySQL索引优化与分析(重要)

    建表SQL CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR (24) NULL DEFAULT '' COM ...

  7. mysql的sid号怎么查_mysql表查询练习

    准备数据 create table book( id int primary key auto_increment, name varchar(16), price int ); create tab ...

  8. mysql模糊查询sal怎么写_MySQL条件查询

    MySQL条件查询 条件查询需要用到where语句,where必须放到from语句表的后面. 支持如下运算符: 运算符 说明 = 等于 <>或!= 不等于 < 小于 <= 小于 ...

  9. mysql的分页查询用哪个关键字_MySQL 分页查询

    一.语法和公式 1.分页语法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT ...

最新文章

  1. 【计算机网络】数据链路层 : 广域网 ( HDLC 协议 | HDLC 站 | HDLC 帧格式 | HDLC 帧类型 | PPP 协议 与 HDLC 协议 对比 )
  2. 1、python基础速成
  3. scp传文件时报错Add correct host key in /root/.ssh/known_hosts to get rid of this message
  4. 计算机中丢失api-ms-win-crt-runtime-
  5. 「三分钟系列06」3分钟看懂http与https的区别
  6. HDOJ--1106排序
  7. python 分页插件
  8. c# implicit explicit关键字(隐式和显式数据类型转换)
  9. 微信僵尸粉删除工具 WeTool v4.0.7.0 免费版
  10. java提取富文本文字_富文本中文字部分提取
  11. 仿b站Java_推荐 9 个 GitHub 上练手项目(在线考试、仿美团、仿抖音、仿B站、仿头条...)...
  12. 求123456789=x成立个数
  13. 使用DISM启用或禁用Windows功能
  14. 计算机c盘如何腾出空间,WIN8的C盘太大怎么清理腾出空间呢
  15. 毕业设计论文选题系统系统用例图_毕业设计管理系统UML
  16. Excel同时打开两个表格
  17. NC6.5与UAP开发学习完整教程
  18. 魔兽世界-战士的真谛
  19. python agg
  20. Kalendae多选日历插件

热门文章

  1. 高阶函数 实现sum(2)(3) 柯里化
  2. 去除inline-block间隙的几种方法
  3. CSS 属性 - 伪类和伪元素的区别
  4. 原型 - 实现自己的jQuery
  5. 洛谷P2822 组合数问题
  6. js 计算对象数组中某个属性值重复出现的个数
  7. 设计模式(五)--工厂模式汇总
  8. 前台用js、jquery出现错误很多是由于IE缓存
  9. 转载:glut.h 与 stdlib.h中 的exit()重定义问题的解决
  10. 爱课程c语言函数2的作业答案,C语言程序设计