在WEB应用开发的过程中,由于初期的数据量比较少,有的开发人人员在书写SQL语句时往往更加重视功能上的实现,而忽略了性能的问题。但是当系统上线后,随着生产数据量的急剧增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,此时这些有问题的SQL语句就会成为系统的性能瓶颈。如何对这些SQL语句进行优化提升性能就成为了我们必须要解决的问题。
如果想要针对SQL语句层面展开优化,首先我们需要做的是找出哪些查询语句慢,如果通过编写代码去一个一个的测试会很耗时耗力,幸运的是MySQL为我们提供了慢查询日志,下面就来了解一些MySQL慢查询日志的基本内容。
1. MySQL慢查询日志简介
慢查询日志是MySQL提供的一种日志记录,主要用来记录查询时长超过指定时间的查询语句。开发人员可以通过慢查询日志找出执行时间较长、执行效率低的SQL语句,从而有针对性的进行优化。
2.慢查询日志配置操作
2.1查看是否开启慢查询日志,1/on表示开启,0/off表示关闭。
show VARIABLES like 'slow_query_log';
复制
2.2未使用索引的查询也被记录到慢查询日志中,on表示开启,off表示关闭(默认值)。
show VARIABLES like 'log_queries_not_using_indexes';
复制
2.3 慢查询阈值(秒级),当查询时间大于设定的阈值时,记录日志。
show VARIABLES like 'long_query_time';
复制
2.4慢查询日志存储路径
show variables like 'slow_query_log_file';
复制
2.5 自定义慢查询日志配置
set global slow_query_log = on;
set global log_queries_not_using_indexes = on;
set global long_query_time = 0;
复制
3.安装慢查询日志分析工具
1.下载安装工具
wget percona.com/get/pt-query-digest
2.授予用户执行权限
chmod u+x pt-query-digest
3.移动位置,目的是方便pt-query-digest的使用
mv pt-query-digest usr/bin/
4.安装与Perl相关的模块
yum install perl-DBI perl-Digest-MD5 perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-ExtUtils-Embed perl-Time-HiRes -y
或依次执行下面命令
yum install perl-DBI -y
yum install perl-Digest-MD5 -y
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y
yum install perl-ExtUtils-Embed -y
yum install perl-Time-HiRes -y
复制
分析慢查询日志中SQL的统计结果:
# 70ms user time, 20ms system time, 20.12M rss, 165.41M vsz
# Current date: Sun Dec 1 21:20:22 2019
# Hostname: javaInit01
# Files: var/run/mysqld/mysqld-slow.log
//总共有多少条查询
# Overall: 2 total, 1 unique, 0.00 QPS, 0.02x concurrency ________________
//查询日志记录的时间范围
# Time range: 2018-11-01 20:58:47 to 21:35:46
//属性 总计 最小 最大 平均 95% 标准 中等
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
//执行时间
# Exec time 39s 14s 24s 19s 24s 7s 19s
//锁占用时间
# Lock time 233us 69us 164us 116us 164us 67us 116us
//发送到客户端的行数
# Rows sent 6 1 5 3 5 2.83 3
//select语句扫描行数
# Rows examine 38.15M 19.07M 19.07M 19.07M 19.07M 2.83 19.07M
//查询的字符数
# Query size 84 42 42 42 42 0 42
/**注释:
Rank:所有语句的排名,默认按查询时间降序排列,通过--order-by指定
Query ID:语句的ID,(去掉空格和查询条件中的文本值,计算hash值)
Response:总的响应时间
time:该查询在本次分析中总的时间占比
calls:执行次数,即本次分析总共有多少条这种类型的查询语句
R/Call:平均每次执行的响应时间
V/M:方差均值比(Variance-to-mean),也就是常说的离差指数。
Item:查询对象
*/
# Profile
# Rank Query ID Response time Calls R/Call V/M
# ==== ================================== ============== ===== ======= ===
# 1 0x3992D6F8E9C2C994AC70C8DFD95C72CE 38.7578 100.0% 2 19.3789 2.68 SELECT card
/**注释:
ID:查询的ID号,和上面的Query ID对应
*/
# Query 1: 0.00 QPS, 0.02x concurrency, ID 0x3992D6F8E9C2C994AC70C8DFD95C72CE at byte 404
# This item is included in the report because it matches --limit.
# Scores: V/M = 2.68
# Time range: 2019-12-01 20:58:47 to 21:35:46
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 100 2
# Exec time 100 39s 14s 24s 19s 24s 7s 19s
# Lock time 100 233us 69us 164us 116us 164us 67us 116us
# Rows sent 100 6 1 5 3 5 2.83 3
# Rows examine 100 38.15M 19.07M 19.07M 19.07M 19.07M 2.83 19.07M
# Query size 100 84 42 42 42 42 0 42
# String:
//数据库名
# Databases test
//服务器地址IP
# Hosts 192.168.246.1
//各个用户执行的次数(占比)
# Users root
//查询时间分布, 长短体现区间占比,本例中1s-10s之间查询数量是10s以上的两倍。
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s
# 10s+ ################################################################
//查询中涉及到的表
# Tables
# SHOW TABLE STATUS FROM `test` LIKE 'card'\G
# SHOW CREATE TABLE `test`.`card`\G
//SQL语句
# EXPLAIN /*!50100 PARTITIONS*/
select * from card order by rand() limit 5\G
复制
找到慢查询SQL之后我们就可以通过explain分析语句,然后进行优化。
文章转载自小度do,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
MySQL数据库当前和历史事务分析
听见风的声音
377次阅读
2025-04-01 08:47:17
墨天轮个人数说知识点合集
JiekeXu
372次阅读
2025-04-01 15:56:03
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
348次阅读
2025-03-28 16:28:31
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
300次阅读
2025-04-15 14:48:05
MySQL8.0直方图功能简介
Rock Yan
278次阅读
2025-03-21 15:30:53
MySQL 有没有类似 Oracle 的索引监控功能?
JiekeXu
267次阅读
2025-03-19 23:43:22
云和恩墨杨明翰:安全生产系列之MySQL高危操作
墨天轮编辑部
261次阅读
2025-03-27 16:45:26
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
251次阅读
2025-04-15 23:49:58
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
246次阅读
2025-04-07 12:14:29
PG vs MySQL 执行计划解读的异同点
进击的CJR
169次阅读
2025-03-21 10:50:08