本文 的 原文 地址
原始的内容,请参考 本文 的 原文 地址
本文 的 原文 地址
尼恩说在前面:
在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、shopee、百度、网易的面试资格,遇到很多很重要的面试题:
MySQL的慢查询、如何监控、如何排查?
你知道如何排查慢sql嘛?
你知道如何对mysql进行优化嘛?
mysql慢查询如何定位分析?哪些情况会导致慢查询?
没开sql慢查询日志,怎么发现慢 sql?
前几天 小伙伴面试 哈罗,遇到了这个问题。但是由于 没有回答好,导致面试挂了。
小伙伴面试完了之后,来求助尼恩。
那么,遇到 这个问题,该如何才能回答得很漂亮,才能 让面试官刮目相看、口水直流。
所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。
当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典》V145版本PDF集群,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
最新《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取,后台回复:领电子书
一:什么是 慢 SQL(慢查询) 日志?
MySQL的慢查询日志是MySQL提供的一种日志记录。
MySQL的慢查询日志 ,主要 用来记录在MySQL中响应的时间超过 执行时长阈值的语句, 执行时长阈值 通过 一个 参数 long_query_time(默认是10秒)配置。
一个SQL的执行,只要 超过 这个 long_query_time 时长, 就会被判为慢查询, 会被记录到慢查询日志中。
二: SQL 到底 执行 多长时间,才为慢SQL ?
慢 SQL 时间 长度是 “执行耗时超出业务或数据库的合理阈值”,但具体定义需结合数据库类型、业务场景、硬件配置综合判断,无绝对统一标准。
慢 SQL 时间 长度 通常分为 通用阈值 和 业务定制阈值 两类:
第一个维度:通用参考阈值(以 MySQL 为例)
数据库层面默认有基础标准,最典型的是 MySQL 的long_query_time
参数(慢查询日志的核心触发条件):
默认值: 10 秒 (即执行时间≥10 秒的 SQL 会被标记为慢 SQL);
实际场景:多数业务会将阈值下调至1-2 秒(因 10 秒远超用户可接受的响应时间,比如 Web 页面加载通常要求 < 2 秒,接口响应 < 500ms)。
第二个维度:业务定制阈值(更关键)
通用阈值仅作参考,真正的慢 SQL 定义需贴合业务场景,例如:
-
高频核心业务(如电商下单、支付接口):阈值可能设为500ms(若 SQL 执行 1 秒,会直接导致用户卡顿);
-
低频非核心任务(如每日数据统计):阈值可放宽至1 秒 - 20s(后台执行,不影响用户体验);
三:如何设置 慢SQL 相关参数?
下面是一些关键参数设置:
-
slow_query_log:控制慢查询日志的开关。
设置成 1,日志就开启;设置成 0,日志就关闭。
-
log-slow-queries(旧版本 5.6 以下使用)和slow-query-log-file(5.6 及以上版本使用):
这两个参数用来指定慢查询日志的保存位置。如果不设置,系统会自动生成一个默认文件,名字是 “主机名 - slow.log”。
-
long_query_time:慢查询阈值:
它决定了什么样的查询算慢查询,只要 SQL 语句执行时间超过这里设置的时长,就会被记录到日志里。
-
log_queries_not_using_indexes:
这是个可选参数,打开后,没命中索引的查询语句也会被记录下来。
-
log_output:用来选择日志保存方式。
有 FILE(快) , TABLE(满) 两种方式保持日志。设置成FILE,日志就存到文件里,这是默认方式;
设置成 TABLE,日志会存到数据库的mysql.slow_log表里。
也可以同时用两种方式,写成FILE,TABLE。不过,存到数据库表比存到文件更费资源,如果既想开慢查询日志,又想数据库跑得快,建议优先把日志存到文件里。
slow_query_log 的 参数查看:
mysql> show VARIABLES like '%slow_query_log%';
+---------------------+-----------------------------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | d:\java\mysql-5.7.28-winx64\data\DEEP-2020AEBKQR-slow.log |
+---------------------+-----------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)
long_query_time 的 参数查看:
mysql> show VARIABLES like 'long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set, 1 warning (0.00 sec)
设置启用慢查询日志:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
注意:修改全局参数后,当前连接会话仍使用旧值,需新建会话才会生效,需要重新登录
查看修改后参数:
mysql> show VARIABLES like '%slow_query_log%';
+---------------------+-----------------------------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | d:\java\mysql-5.7.28-winx64\data\DEEP-2020AEBKQR-slow.log |
+---------------------+-----------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)mysql> show VARIABLES like 'long_query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set, 1 warning (0.00 sec)
四:3大 慢 SQL 分析工具
慢查询分析一般分为三个步骤
1、 EXPLAIN
2、 OPTIMIZER_TRACE
3、 PROFILE
上面三大工具的 具体使用方法,请参见尼恩之前的博客文章:
凌晨2点,报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
五、没开慢查询日志,怎么发现慢 SQL? (4个方法)
慢查询日志是 “事后追溯” 的核心工具,但未开启时,可通过「实时监控」「资源排查」「业务反馈」三类手段主动发现慢 SQL,覆盖实时问题定位和历史问题追溯场景。
...................由于平台篇幅限制, 剩下的内容(5000字+),请参参见原文地址
原始的内容,请参考 本文 的 原文 地址
本文 的 原文 地址