MySQL 慢查询日志 使用方法浅析 日志定位与优化技巧

news2025/2/28 17:16:25

目录

前言

1、如何开启使用慢查询日志?

1.1 开启慢查询日志

1.2 设置慢查询阈值

1.3 确定慢查询日志的文件名和路径

    1.3.1 查询MySQL数据目录

    1.3.2 查询慢查询日志文件名

     1.3.3 查询全局设置变量

    1.3.4 查询单个变量命令

   1.3.5  其他注意事项

2、如何定位并优化慢查询SQL?

2.1 慢查询例子演示

    2.1.1 慢查询日志 查看执行语句与Query_time参数实际执行时间

    2.1.2 其他注意事项

2.2、查询语句慢怎么办?explain分析sql执行计划

    2.2.1 explain分析一下执行计划

    2.2.2 select_type值表

    2.2.3 type列,本文是ALl则是全表扫描

    2.2.4 Extra列,这里是Using filesort

    2.2.5 使用索引之后查看慢查询日志发现,查询数据的速度快了2s

    2.2.6 实操练习联调索引与未添加索引 查询速度对比

3、当主键索引、唯一索引、普通索引都存在,查询优化器如何选择?


前言

    简短总结即开启MySQL慢查询日志开关和并设置预期阀值,查看已记录超过预期阀值时间的日志记录慢的语句和时间,查看现有查询策略然后设置索引,尝试优化查询语句并对比查询结果耗时最终得到最优解。


 

1、如何开启使用慢查询日志?

1.1 开启慢查询日志

    首先开启慢查询日志(默认关闭),在MySQL命令行下输入下面的命令:

MySQL > set global slow_query_log=on;

1.2 设置慢查询阈值

    SQL实际执行时间超过设置阈值就会被记录到慢查询日志里面。阈值默认是10s,线上业务一般建议把long_query_time设置为1s,如果某个业务的MySQL要求比较高的QPS,可设置慢查询为0.3s。

MySQL > set global long_query_time=1;

1.3 确定慢查询日志的文件名和路径

    1.3.1 查询MySQL数据目录

MySQL > show global variables like 'datadir';

    1.3.2 查询慢查询日志文件名

MySQL > show global variables like 'slow_query_log_file'

     1.3.3 查询全局设置变量

MySQL > show global variables like '%quer%';

    1.3.4 查询单个变量命令

MySQL >  show status like '%slow_queries%';

   1.3.5  其他注意事项

    发现慢查询及时优化或者提醒开发改写。一般测试环境建议long_query_time设置的阀值比生产环境的小,比如生产环境是1s,则测试环境建议配置成0.5s。便于在测试环境及时发现一些效率的SQL。 甚至某些重要业务测试环境long_query_time可以设置为0,以便记录所有语句。并留意慢查询日志的输出,上线前的功能测试完成后,分析慢查询日志每类语句的输出,重点关注Rows_examined(语句执行期间从存储引擎读取的行数)提前优化。

    重启mysql客户端设置和统计慢查询日志条数就会清零,即所有命令配置修改会还原。在配置文件修改才能永久改变,否则重启数据库就还原。 


2、如何定位并优化慢查询SQL?

1. 根据慢日志定位慢查询sql

2. 使用explain等工具分析sql执行计划

3. 修改sql或者尽量让sql走索引

2.1 慢查询例子演示

    2.1.1 慢查询日志 查看执行语句与Query_time参数实际执行时间

Linux > tail -n 500 /var/lib/ mysql/tv6 -hote lqa-newhotel-14-slow.log

查询结果Query_time: 6.337729s,SQL执行时间超过了1s故被记录了,第9行为执行语句。

其他参数说明:

  • Time:慢查询发生的时间

  • Query_time:查询时间

  • Lock_time:等待锁表的时间

  • Rows_sent:语句返回的行数

  • Rows_exanined:语句执行期间从存储引擎读取的行数

    2.1.2 其他注意事项

    上述方式是用系统自带的慢查询日志查看,系统自带的慢查询日志不方便查看,可使用 pt-query-digest 或者 mysqldumpslow 等工具对慢查询日志进行分析。

    部分慢查询正在执行结果已经导致数据库负载过高,而由于慢查询还没执行完,因此慢查询日志看不到任何语句,此时可以使用 show processlist 命令查看正在执行的慢查询。show processlist显示哪些线程正在运行,如果有PROCESS权限,则可以看到所有线程。否则只能看到当前会话线程。

2.2、查询语句慢怎么办?explain分析sql执行计划

    2.2.1 explain分析一下执行计划

> explain select group_name from groups order by group_name desc;

    2.2.2 select_type值表

序号

Column

描述
1SIMPLE

简单查询(不使用UNION或子查询)

2PRIMARY

主查询、外查询

3UNION

UNION中第二个语句或后面的语句

4UNION RESULT

UNION每个结果集的取出来后,进行合并操作

5DEPENDENT SUBQUERY

子查询中第一个SELECT

6DEPENDENT UNION

子查询中的UNION操作,从UNION 中第二个及之后的所有SELECT语句

7DERIVED

派生表,子查询在 FROM子句中

8MATERIALIZED

被物化的子查询

9UNCACHEABLE SUBQUERY

一个子查询的结果不能被缓存,必须重新评估外层查询的每一行

10UNCACHEABLE UNION

关联查询第二个或后面的语句属于不可缓存的子查询

    2.2.3 type列,本文是ALl则是全表扫描

序号Type值描述
1system查询对象表只有一行数据,且只能用于 MySAM 和 Memory 引擎的表,这是最好的情况
2const基于主键或唯一索引查询,最多返回一条结果
3eq_ref表连接时基于主键或非 NULL 的唯一索引完成扫描
4ref基于普通索引的等值查询,或者表间等值连接
5fulltext全文检索
6ref_or_null表连接类型是 ref,但进行扫描的索引列中可能包含 NULL 值
7index_merge利用多个索引
8unique_subquery子查询中使用唯一索引
9index_subquery子查询中使用普通索引
10range利用索引进行范围查询
11index全索引扫描
12ALL全表扫描

表格从上到下代表了sql查询性能从最优到最差,如果是type类型是all,说明sql语句需要优化。

    说明:如果type = NULL,则表明个MySQL不用访问表或者索引,直接就能得到结果,比如explain select sum(1+2);

    possible_keys代表可能用到的索引列,key表示实际用到的索引列,以实际用到的索引列为准,这是查询优化器优化过后选择的,然后我们也可以根据实际情况强制使用我们自己的索引列来查询。

    2.2.4 Extra列,这里是Using filesort

     一定要注意,Extra中出现Using filesort、Using temporary代表MySQL根本不能使用索引,效率会受到严重影响,应当尽可能的去优化。

    出现Using filesort说明MySQL对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容,有索引就维护了B+树,数据本来就已经排好序了,这说明根本没有用到索引,而是数据读完之后再排序,可能在内存或者磁盘上排序。也有人将MySQL中无法利用索引的排序操作称为“文件排序”。出现Using temporary表示MySQL在对查询结果排序时使用临时表,常见于order by和分组查询group by。

    2.2.5 使用索引之后查看慢查询日志发现,查询数据的速度快了2s

MySQL > select name from person_info_large order by name desc;

    2.2.6 实操练习联调索引与未添加索引 查询速度对比

// 添加索引
MySQL > alter table person_ info_ large add index idx_ name(name);
// 查看执行计划
MySQL > explain select name from person_info_large order by name desc;
// 执行查询语句
MySQL > select name from person_ info_large order by name desc;

    对比一下前面name不加索引时的执行计划就会发现,加了索引后,type由ALL全表扫描变成index索引扫描。order by并没有 using filesort,而是using index,这里B+树已经将这个非聚集索引的索引字段的值排好序了,而不是等到查询的时候再去排序。


3、当主键索引、唯一索引、普通索引都存在,查询优化器如何选择?

    实际使用哪个索引是查询优化器决定的,B+树的叶子结点就是链表结构,遍历链表就可以统计数量,但是这张表,有主键索引、唯一索引、普通索引,优化器选择了account这个唯一索引,这肯定不会使用主键索引,因为主键索引是聚集索引,每个叶子包含具体的一个行记录(很多列的数据都在里面),而非聚集索引每个叶子只包含下一个主键索引的指针,很显然叶子结点包含的数据是越少越好,查询优化器就不会选择主键索引。

// 强制使用主键索引,然后分析sql执行计划
MySQL > explain select count(id) from person_ info large force index (primary);

// 优化器默认使用唯一索引大致执行时间
MySQL > select count(id) from person_info_large;

// 强制使用主键索引大致执行时间
MySQL > select count(id) from person_info_large force index (primary);

    使用 force index 强制指定索引,然后去分析执行计划看看哪个索引是更好的,因为查询优化器选择索引不一定是百分百准确的,具体情况可以根据实际场景分析来确定是否使用查询优化器选择的索引。

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

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

相关文章

备战2023蓝桥国赛-重新理解Prim和Kruskal算法

备战2023蓝桥国赛-重新理解Prim和Kruskal算法Prim算法Kruskal算法Prim算法 题目描述: 解析: prim算法跟dijkstra的朴素解法有很多相像部分,他们都是枚举中继节点来更新下一个节点,都是选最小的dist值来更新,时间复杂…

【线性表】—动态顺序表的增删查改实现

小菜坤日常上传gitee代码:https://gitee.com/qi-dunyan(所有的原码都放在了我上面的gitee仓库里) 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介:双一流非科班的一名小白,期待与各位大佬一起努…

【网页设计】期末大作业html+css(动漫网站)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【机器学习项目实战10例】(十):DataCastle-租金预测

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、DataCastle-租金预测二、数据集介绍三、导入相关库四、读取数据五、删除缺失值过多的列六、填补缺失数据七、特征编码八、简单跑一下九、可视化数据分布9.1 箱线图9.2 直方图和Q-Q图一、DataCastle-租金预测 本项目任务…

【ASM】字节码操作 工具类与常用类 AnalyzerAdapter 工作原理

文章目录 1.概述2.xx3.工作原理3.1初始状态3.2中间状态3.2.1顺序执行3.2.2发生跳转.2.3特殊情况: new对象3.3结束状态4.示例:打印方法的Frame4.2 编码实现5.总结1.概述 在上一篇文章: 【ASM】字节码操作 工具类与常用类 AnalyzerAdapter初步介绍 我们知道 AnalyzerAdapter 主…

Android开发java调用C简单示例

目录下载NDK和CMake新建NDK项目写入C代码,并运行本文使用的Android Studio版本是windows版Android Studio Bumblebee | 2021.1.1 Patch 2 先看下最终效果: 下载NDK和CMake 检查NDK和CMake是否已经下载了,这一步不难,具体步骤就…

工业动态界面设计 GLG Toolkit 4.2 Crack-GlgCE.4.2_x64

GLG Toolkit是为开发高级图形的动态界面而设计的框架:不只是简单的按钮和选单,而且是完全动画的图形对象,它能够显示动态数据和作出与用户交互的反应。它不仅是一个能够创建很多“漂亮的图片”绘图工具,而且它的图形引擎允许开发人…

Spring Boot 使用Docker构建运行

Docker 容器化 Spring Boot 应用 在应用容器化、容器编排大行其道的当下。今天来学习下如何使用Docker技术打包、构建、运行Spring Boot 应用程序,从最简单的Dockerfile开始,一步步的学习Docker 容器的使用过程。 Spring Boot 应用系统 创建项目 使用…

[足式机器人]Part3机构运动微分几何学分析与综合Ch02-3 平面机构离散运动鞍点综合——【读书笔记】

本文仅供学习使用 本文参考: 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch02-3 平面机构离散运动鞍点综合2.4 鞍滑点2.4.1 鞍线与二副连架杆P-R2.4.2 鞍线误差2.4.3 三位置鞍线2.4.4 四位置鞍线2.4 鞍滑点 在平面机构运动综合时&#xff…

实验七 循环神经网络(2)梯度爆炸实验

目录6.2 梯度爆炸实验6.2.1 梯度打印函数【思考】什么是范数,什么是L2范数,这里为什么要打印梯度范数?6.2.2 复现梯度爆炸现象6.2.3 使用梯度截断解决梯度爆炸问题【思考题】梯度截断解决梯度爆炸问题的原理是什么?6.2 梯度爆炸实…

基于遗传算法的风电储能蓄电池容量优化配置matlab优化程序

基于遗传算法的风电储能蓄电池容量优化配置 风电储能蓄电池微电网配置(基于matlab的遗传算法微电网配置优化程序) 参考文献:基于遗传算法的风电储能蓄电池容量优化配置 摘要:为了降低独立风力发电系统中储能装置的生命周期费用&a…

【数据物语系列】 漫谈数据分布可视化分析

【数据物语系列】 漫谈数据分布可视化分析 FesianXu 20221125 at Baidu Search Team 前言 在实际工作中,我们经常会遇到一堆数据,对数据的有效分析至为关键,而数据的分布就是一种非常重要的数据属性,需要通过合适的可视化手段进行…

【创建springboot-maven项目搭建mybatis框架】(超详细)

目录 1. 创建Spring Boot项目,相关参数 2. 创建数据库 3. 在IntelliJ IDEA中配置Database面板 4. 添加数据库编程的依赖 5. 关于Mybatis框架 6. Mybatis编程:插入相册数据 1. 创建Spring Boot项目,相关参数 项目名称:csmall…

[附源码]java毕业设计中小企业人力资源管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

javaEE飞机航班信息查询网站系统

本系统主要包含了订票管理、航班信息管理、站内新闻管理、活动信息管理、用户信息管理、留言等多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块:管理员登录系统后台对本系统其他管理模块进行管理。 添加管理员模块:向本系统中…

UE5笔记【十】第一个蓝图项目:bluePrint。

我们将上升的斜坡或者楼梯隐藏,往下移动,使其隐藏在地面以下。然后将方块也向下移动,漏出一点来。我们要模拟的场景是:当人移动到蓝色方块上时,踩在方块上,上升的楼梯升起来。然后人可以上楼。 将蓝色方块…

HTML静态网页作业——电影介绍-你的名字 5页 无js 带音乐

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

基于双层优化的微电网系统规划设计方法matlab程序(yalmip+cplex)

基于双层优化的微电网系统规划设计方法matlab程序(yalmipcplex) 参考文献:基于双层优化的微电网系统规划设计方法 摘要:规划设计是微电网系统核心技术体系之一。从分布式电源的综合优化(组合优化、容量优化)和分布式电源间的调度…

【虚幻引擎UE】UE5 两种球体绘制方法

一、网格球体绘制 center 中心点向量 segments参数越大,线条越多 radius是球体半径 thickness 厚度可以不用管 Depth Priority 是渲染深度可以不用管 F Life Time 是持续时间 C代码如下—— .cpp #include "drawBallFunc.h" #include "Components…

机器学习中的数学基础(二)

机器学习中的数学基础(二)2 线代2.1 矩阵2.2 矩阵的秩2.3 内积与正交2.4 特征值与特征向量2.5 SVD矩阵分解2.5.1 要解决的问题2.5.2 基变换2.5.3 特征值分解2.5.4 奇异值分解(SVD)在看西瓜书的时候有些地方的数学推导(…