我们经常会接触到MySQL,也经常会遇到一些MySQL的性能问题。我们可以借助慢查询日志和explain命令初步分析出SQL语句存在的性能问题
SHOW FULL PROCESSLIST相当于select * from information_schema.processlist可以列出正在运行的连接线程,
processlist
说明:
慢查询日志是MySQL用于记录响应时间超过设置阈值(long_query_time)的SQL语句,默认情况下未开启慢查询日志,需要手动配置。
下面我们要记住几个常用的属性:
我们可以通过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
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
上面几点大概的介绍到了几种获取慢查询SQL语句的方式,现在,我们就需要借助explain来分析查找SQL语句慢的原因。explain使用也很简单,直接在SELECT|UPDATE等语句前加上EXPLAIN即可
explain
表的执行顺序,复制的sql语句往往会分为很多步,序号越大越先执行,id相同执行顺序从上往下
数据读取操作的操作类型:
数据来源于那张表,关联等复杂查询时会用临时虚拟表
检索数据的方式
显示可能使用的索引
实际使用的索引
索引的长度,一般来说,长度越短越好
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
估算查找的结果记录条数
SQL查询的详细信息
[参考]
MySQL Explain详解