我们经常会接触到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分析 。
下面我们要记住几个常用的属性:
- 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的方式去查询,一般性能要求相对较高的建议存文件)
文章插图
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# Attributepcttotalminmaxavg95%stddevmedian# ============ === ======= ======= ======= ======= ======= ======= =======# Count869# Exec time1147s1s3s2s3s685ms2s# Lock time0140ms2ms22ms2ms3ms2ms2ms# Rows sent00000000# Rows examine023.96M 225.33k 482.77k 355.65k 462.39k81.66k 345.04k# Query size217.72k2632632632630263# String:# Databasesxxxx# Hostsxx.xxx.xxx.xxx# Usersroot# 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即可文章插图
explain
id表的执行顺序,复制的sql语句往往会分为很多步,序号越大越先执行,id相同执行顺序从上往下
select_type【mysql慢查询语句分析总结】数据读取操作的操作类型:
- SIMPLE(简单SELECT,不使用UNION或子查询等)
- PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
推荐阅读
- MySQL8.0大表秒加字段,是真的吗?
- 网易云背后的数据库:Facebook开源,完全兼容MySQL
- MySQL底层之MVCC、回滚段、一致性读、锁定读
- 数据库:innodb数据组织形式
- Excel多条件查询,一个万能公式,不理解可以直接套用
- 家里WiFi慢?几招帮你解决
- 强人“锁”难,MySQL到底有多少锁?
- 聊聊Mysql——慢sql优化方法论
- 喝茶养壶之乐,养壶是慢功
- 开源数据库SQLite、MySQL和PostgreSQL比较