mysql 关联查询慢_mysql慢查询语句分析总结

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

通过SHOW FULL PROCESSLIST查看问题

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

a8ebff3c7468e8a89e9cad059497686a.png

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 ‘%关键字%’的方式查询我们设置的属性值

8a4505cb0cf46cd3bd4311d2b9f09056.png

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.loglong_query_time = 1log-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`GUPDATExxxxxx_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即可

678d1c525c5d656ccff940da9f267b31.png

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详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python opencv3 轮廓检测

git:https://github.com/linyi0604/Computer-Vision 1 # coding:utf82 3 import cv24 import numpy as np5 6 # 创建一个200*200 的黑色空白图像7 img np.zeros((200, 200), dtypenp.uint8)8 # 在图像的中央位置 放置一个100*100的白色方块9 img[50:150, 50: 150] …

CentOS7搭建NTP服务器

搭建ntp服务器 查看服务器、客户端操作系统版本 2查看服务器是否安装ntp 3如果没有安装 4安装完成后重新查看服务器是否安装ntp 5查看ntp服务器状态 6修改配置文件 注释 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.p…

mysql 5.7.21-linux_MySQL 5.7.21 Linux平台安装 Part 2

从今天开始MySQL相关方面的东西今天是关于MySQL的安装系统为 redhat 6.10数据库为MySQL 5.7.21PS:目前最新版本为MySQL 5.7.251. 目录规划2. MySQL 5.7 下载目前MySQL 社区的GA 提供5 和8 的下载由于目前大多数系统用的还是5的版本这里统一使用5的版本注意,下面是按…

session很快失效_深夜,我偷听到程序员要对session下手...

我是一个web服务器我的工作是给人类提供上网服务,我每天要为数以万计的人提供网页浏览服务。已经是深夜了,我还在和手下几个兄弟为了一件事紧张讨论着。“老大,现在咱们每天处理的请求越来越多了,session同步的问题不能再拖了&…

centos7安装samba服务器

1查看是否安装samba服务 2如果为空则没有安装,安装显示安装完成即成功 3查看samba状态 4查看配置文件的位置 5配置文件备份,直接传输到本地备份 6修改配置文件 Path共享目录位置 Valid users 可以查看的用户 Browseable可以查看共享文件夹的目录&a…

微信小程序—day01

前言 听说谷歌准备回中国了,玩了一下谷歌刚入驻微信的小程序:“猜画小歌”,又一次见识到了ai的强大魅力。看来python之路,前途还是一片光明的。 因为18年初时的“跳一跳”,带火了微信小程序,一直想要写一个…

docker mysql 操作_[Docker] Docker 快速搭建本地MySQL开发环境

[Docker] Docker 快速搭建本地MySQL开发环境关于 Docker 的安装使用本文不再赘述,有兴趣的可以通过官网或是浏览我的专栏文章了解。今天着重给大家介绍下如何利用Docker快速搭建一个MySQL的环境,来协助本地开发。TOC手机用户请横屏获取最佳阅读体验&…

centos7安装DHCP服务器

1检查防火墙和selinux(关闭) 关闭防火墙和selinux,这边不多说 2检查DHCP状态 3安装DHCP软件包 4把系统默认的样例复制 5修改配置文件 option domain-name “example.org”; --DNS域名 option domain-name-servers ns1.example.org, ns2.…

python装饰器解析_Python 装饰器解析

一、装饰器定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 二、装饰器的作用:在不改变原函数的情况下,为原函数前后添加新的功能 三、装饰器的原则: 1、不能修改被装饰的函数的源代…

centos7网卡识别不到,无法远程工具连接

这是在安装dhcp的时候遇到的问题,远程工具连接不上了。没IP地址没得玩 解决办法 直接在虚拟机打开终端,找到配置文件ifcfg-ens33 TYPE“Ethernet” PROXY_METHOD“none” BROWSER_ONLY“static”----原先的dhcp换成static BOOTPROTO“no” DEFROUTE“ye…

python爬虫脚本ie=utf-8_Python反爬虫伪装浏览器进行爬虫

对于爬虫中部分网站设置了请求次数过多后会封杀ip,现在模拟浏览器进行爬虫,也就是说让服务器认识到访问他的是真正的浏览器而不是机器操作 简单的直接添加请求头,将浏览器的信息在请求数据时传入: 打开浏览器--打开开发者模式--请…

centos7加入第二块网卡无法识别

本来是做DHCP服务加一块网卡的,然后识别不出来,没得玩 centos7加入第二块网卡无法识别 1发现只有一块网卡 2使用nmcli con show命令,查看网卡的UUID信息,记下UUID值 3启动networkManager’ 4识别 5使用ip addr命令查看网卡信息…

hbase 导入mysql_HBase导入SQL Server数据库数据

在先前的几篇随笔中已经介绍了Hadoop、Zookeeper、Hbase的分布式框架搭建方案,目前已经搭建完成了一个包含11个节点的分布式集群。而对于HBase数据库的使用仅限于测试性质的增删改查指令,为了进一步熟悉分布式框架的使用,本文介绍将已有的数据…

googlenet网络结构_CNN网络结构的发展

 CNN基本部件介绍,1. 局部感受野在图像中局部像素之间的联系较为紧密,而距离较远的像素联系相对较弱。因此,其实每个神经元没必要对图像全局进行感知,只需要感知局部信息,然后在更高层局部信息综合起来即可得到全局信…

linux数据库mysql的安装

1数据库文件放到opt下面 2赋予权限775 3运行脚本 4运行成功 5数据库操作 密码修改并刷新 权限修改,允许外部设备访问 6工具连接 7附录 1、显示当前数据库服务器中的数据库列表:   mysql> SHOW DATABASES;   2、建立数据库:   …

智能优化算法应用:基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.侏儒猫鼬算法4.实验参数设定5.算法结果6.…

Centos7中Memcached安装使用说明

安装编译libevent tar -zxvf libevent-2.0.21-stable.tar.gz cd libevent-2.0.21-stable ./configure --prefix/usr 配置报错,不着急,安装gcc试试 可以了 make make install 测试libevent是否安装成功 ls -al /usr/lib|grep libevent 安装成功 2.编译…

mysql-plus多数据库_Springboot+mybatisplus+mysql配置多数据源(注解版)

1、添加依赖,最关键的两个依赖是后面两个"druid依赖"和"配置动态数据源"(已标红),其他"非主要"依赖可按自身实际开发环境进行选择。org.springframework.bootspring-boot-starter-jdbcorg.springframework.bootspring-boo…

python用cmd运行失败_解决python在cmd运行时导入包失败,出现错误信息 ModuleNotFoundError: No module named ***...

1.下图为我的自动化测试工程结构图我通过运行run.bat批处理文件,调用cmd控制台运行start_run.py来开始我的自动化测试,但是出现如下错误:大家可能知道我们的工程在IDE(Pycharm)中运行和我们在cmd中运行的路径是不一样的&#xff0…

Centos7jdk安装

2.1查看现有JDK #rpm -qa|grep jdk (如果有其他版本的JDK建议卸载) 卸载其他版本的JDK命令 #yum –y remove java-1.6.0 #yum –y remov java* 重新安装(安装需要的JDK版本) #chmod 755 jdk-6u45-linux-x64-rpm.bin ./jdk-6u45-linux-x64-rpm.bin安装…