慢查询 MySQL 定位优化技巧,从10s优化到300ms

news/2024/5/2 11:52:58/文章来源:https://blog.csdn.net/m0_71777195/article/details/127008110

1.如何定位并优化慢查询SQL?

一般有3个思考方向 1.根据慢日志定位慢查询sql 2.使用explain等工具分析sql执行计划 3.修改sql或者尽量让sql走索引

2.如何使用慢查询日志?

先给出步骤,后面说明

有3个步骤

1.开启慢查询日志

首先开启慢查询日志,由参数slow_query_log决定是否开启,在MySQL命令行下输入下面的命令:

set global slow_query_log=on;

默认环境下,慢查询日志是关闭的,所以这里开启。

2.设置慢查询阈值

set global long_query_time=1;

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

发现慢查询及时优化或者提醒开发改写。一般测试环境建议long_query_time设置的阀值比生产环境的小,比如生产环境是1s,则测试环境建议配置成0.5s。便于在测试环境及时发现一些效率的SQL。

甚至某些重要业务测试环境long_query_time可以设置为0,以便记录所有语句。并留意慢查询日志的输出,上线前的功能测试完成后,分析慢查询日志每类语句的输出,重点关注Rows_examined(语句执行期间从存储引擎读取的行数),提前优化。

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

show global variables like 'slow_query_log_file'

结果会发现慢日志默认路径就是MySQL的数据目录,我们可以来看一下MySQL数据目录

 show global variables like 'datadir';

不用关注这里为什么不是MySQL 8.0,这和版本没什么关系的。

来,直接上菜,干巴巴的定义我自己都看不下去

我们先来查看一下变量,我框出了需要注意的点

查询带有quer的相关变量

show global variables like '%quer%';

这里设置慢查询阈值为1s

set global long_query_time=1;

可以看到已经修改过来了

但是重启mysql客户端设置和统计慢查询日志条数就会清零,即所有配置修改会还原

命令修改配置之后,在命令行net stop mysql关闭MySQL服务,再net start mysql开启MySQL服务,接着执行show global variables like '%quer%';会发现配置还原了。

在配置文件修改才能永久改变,否则重启数据库就还原了

3.慢查询例子演示,新手都能看懂

数据表结构,偷懒没写comment

CREATE TABLE `person_info_large` (  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,  `account` VARCHAR (10),   `name` VARCHAR (20),  `area` VARCHAR (20),  `title` VARCHAR (20), `motto` VARCHAR (50),PRIMARY KEY (`id`),  UNIQUE(`account`),KEY `index_area_title`(`area`,`title`) 
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8  

这里的数据是200W条。请注意表结构,记住哪几个字段有索引即可,后续围绕这个表进行分析。

这个3.36s并不是实际执行时间,实际执行时间得去慢查询日志去看Query_time参数

可以看到Query_time: 6.337729s,超过了1s,所以会被记录,一个select语句查询这么久,简直无法忍受。

图中其他的参数解释如下:

  • Time:慢查询发生的时间

  • Query_time:查询时间

  • Lock_time:等待锁表的时间

  • Rows_sent:语句返回的行数

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

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

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

4.查询语句慢怎么办?explain带你分析sql执行计划

根据上一节的表结构可以知道,account是添加了唯一索引的字段。explain分析一下执行计划。

我们重点需要关注select_typetypepossible_keyskeyExtra这些列,我们来一一说明,看到select_type列,这里是SIMPLE简单查询,其他值下面给大家列出。

type列,这里是index,表示全索引扫描

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

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

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

Extra列,这里是Using index

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

出现Using filesort说明MySQL对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容,有索引就维护了B+树,数据本来就已经排好序了,这说明根本没有用到索引,而是数据读完之后再排序,可能在内存或者磁盘上排序。也有人将MySQL中无法利用索引的排序操作称为“文件排序”。另外,搜索公众号顶级科技后台回复“物联网平台”,获取一份惊喜礼包。

出现Using temporary表示MySQL在对查询结果排序时使用临时表,常见于order by和分组查询group by

回到上一个话题,我们看到account是添加了唯一索引的字段。explain分析了执行计划后

直接按照account降序来查

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

接着我们分析一下查询name的sql执行计划

然后给name字段加上索引

加上索引之后,继续看看查询name的sql执行计划

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

接着我们继续执行查询语句,此时name已经是添加了索引的。

结果发现,name添加索引之前,降序查询name是花费6.337729s,添加索引之后,降序查询name花费了3.479827s,原因就是B+树的结果集已经是有序的了。

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

查询一下数据的条数,这里count(id),分析一下sql执行计划

这里实际使用的索引是account唯一索引。

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

当然,也可以强制使用主键索引,然后分析sql执行计划

我们看一下优化器默认使用唯一索引大致执行时间676ms

强制使用主键索引大致执行时间779ms

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

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

office project【图文详解】

Office Project是一款全面实用的项目管理软件。 Office Project2021正式版来自推出的项目管理软件。最新版本的Microsoft Office Project2021软件拥有最简单的项目管理方法,用户可以根据每个人的工作情况轻松分配工作量和项目执行时间。Project 安装包各个版本 htt…

(附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740

摘 要 本文介绍了使用PHPMySQL数据库和微信应用为儿童艺术学校实现教育应用的过程。本文介绍的教育应用是为儿童艺术学校设计的,这意味着该系统可用于教授儿童艺术和艺术视频。该系统的主要功能是可以将儿童艺术教育的线下方式转变为线上,从教育机构的角…

微信小程序组件介绍

组件view 普通视图区域 类似于html中的div是一个块级元素 .wxml代码 <view class"container1" ><view>温度</view><view>湿度</view> <view>光照强度</view> </view> .wxss代码—— .container1 view{width: 100…

linux 内存管理

用户空间与内核空间 人间还是仙界&#xff1f;聊一聊linux系统的用户空间和内核空间 以32 位Linux系统为例&#xff0c;虚拟地址的大小是4GB (0x0000_0000 ~ 0xffff_ffff)。 Linux 用户空间和 内核空间的大小可以通过设置宏 PAGE_OFFSET 来配置&#xff0c;默认PAGE_OFFSET 0…

Oracle数据库中的包(七)

目录 1.Oracle中包 2.包的创建 &#xff08;1&#xff09;可视化方式创建包 &#xff08;2&#xff09;以命令方式创建包 ①创建包头 ②创建包体 ③删除包 3.包的初始化 4.重载 ①相关概念和注意事项 ②系统内置的包 Oracle学习的相关知识点&#xff08;汇总&#x…

UGeek大咖说 | 直播预告:顺丰高难度可观测性压测实践与应用

本月「UGeek大咖说-大厂可观测」又双叒……来和大家见面了&#xff01;本期大咖说特邀到顺丰科技应用架构高级工程师——李卓做客直播间&#xff0c;用实际案例带我们一起剖析大型复杂系统下可观测性在全链路压测中的落地实践。 往期大咖说我们对可观测性做了很多诠释和分享&a…

2022安徽省赛赛题——B-2任务二:流量分析

有题有环境有解析,要的私我,勿喷! B-2任务二:流量分析 *任务说明:仅能获取Server2的IP地址 1.使用Wireshark查看并分析Server2桌面下的capture.pcapng数据包文件,找出黑客获取到的可成功登录目标服务器Telnet服务的账号密码,并将黑客获取到的账号密码作为Flag值(用户…

开创性的区块链操作系统项目——去中心化簿订单交易所

关于区块链操作系统上的 Web2 和 Web3 先驱系列今天向大家介绍来自Dakai的 Peter、Laszlo 和 Mark 。Web3 开发人员通过他们的去中心化簿订单交易所推进了区块链技术的发展。他们正在使用 Python 和 SQLite 作为数据库引擎来进行开发&#xff0c;他们发现他们可以在区块链操作系…

js与jquery实例-拖动改变列宽和行高

如何通过javascript或者jquery实现改变表格宽度或者行高的功能?今天就把这个功能代码分享给大家,绝对原创哦,代码少而且易懂。先看效果图:html结构:html结构:<!DOCTYPE HTML> <html> <head><meta charset="utf-8"><title>table&…

最适合从事游戏建模这类高薪职业的是这些人,快来看看有你吗?

随着游戏行业的发展&#xff0c;游戏建模受到越来越多的人的关注&#xff0c;那游戏建模的学习适用于什么样的人群呢&#xff1f;今天就来介绍一下吧 01 大学毕业&#xff0c;就业方向不明确 大学期间&#xff0c;本专业知识没有深度掌握&#xff0c;无法从事本专业相关的工作…

Vue3 i18国际化

本文参考了两片文章如下&#xff0c;博文原创&#xff0c;转载附上本博文链接即可 1、基于Vue3.0和ElementPlus开发后台框架(loginbacki18n)_zzzzzzzzzz的博客-CSDN博客_vue3后台框架 &#xff08;这个有点没看懂&#xff09; 2、https://www.jianshu.com/p/fa85595642cd&am…

盘点一个Python网络爬虫实战问题

大家好,我是皮皮。 一、前言 前几天在Python铂金交流群【红色基因代代传】问了一个Python网络爬虫的问题,提问截图如下:代码截图如下:报错截图如下:要么就是原始网页没那么多数据,要么就是你自己取到的数据没那么多,有的有排名,有的没有,可以考虑加个try异常处理。首先…

基于单片机的老人防摔GSM报警

目录 1 跌倒报警器研究现状........................................................................................ 8 2.1单片机的功能及最小系统的电路设计.................................................. 9 内置闪存存储器......................................…

雷鸟乐队 VoxEdit 大赛启动啦,24,500 SAND 奖励等你们来赢取!

是鸟……是飞机……是雷鸟&#xff01; 如果你们选择接受它&#xff0c;那么你们的任务是创造一个受 1960 年代标志性电视剧启发的车辆资产&#xff08;汽车、轮船摩托车等&#xff09;。 不要使用雷鸟的 logo 或对现有的雷鸟作品进行二次创作。 24,500 SAND 将按以下方式分配给…

手机远程控制之scrcpy(一)

有线投屏 无线投屏 屏幕录制 常见问题 错误检查 ERROR: Exception on thread 投屏模糊 scrcpy 是免费开源的投屏软件&#xff0c;支持将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上&#xff0c;并可直接借助鼠标在投屏窗口中进行交互和录制。 市面上主流的多屏协…

机器人地面站-[QGroundControl源码解析]-[7]-[api]

目录 前言 一.QmlComponentInfo 二.QGCSettings 三.QGCOptions 四.QGCCorePlugin 总结 前言 上篇讲完了Analyize中内容&#xff0c;主要对应界面上AnalyzeTool模块的功能。本篇我们来过api文件夹下的代码。api下的代码主要实现了qgc的核心接口&#xff0c;应用所有的选项…

为什么2022年7月的PMP考试通过率这么低?

2022年 7月考的是新考纲&#xff0c;有50%的敏捷题型&#xff0c;考题相对旧考纲灵活很多&#xff0c;混合型项目内容较多&#xff0c;要是不好好备考&#xff0c;很有可能挂哦&#xff0c;所以 PMI 官方都发布通知&#xff0c;7、8、9 月没考过的考生可以免费重考一次。 但是&…

rk3368-双以太网口

RK芯片以太网补丁android5-12 就打一个补丁就行, 1.\sdk\device\rockchip\common\init.rockchip.rc service dhcpcd_eth1 /system/bin/dhcpcd -aABDKLclass late_startdisabledoneshot 2.添加文件EthernetNetworkFactoryExt.java 给eth1使用:sdk\frameworks\opt\net\ethern…

docker images 命令详解

文章目录一、docker images 命令选项二、docker images 使用实例2.1 显示最近创建的镜像2.2 根据镜像名和tag值查询2.3 查询结果中显示完整的镜像ID2.4 显示镜像的摘要信息2.5 显示未打tag值的镜像2.6 删除未打tag值额镜像2.7 根据标签筛选镜像2.8 根据时间筛选镜像2.9 通过模糊…

uniapp离线打包安卓APP全过程

1、首先就是下载Android Studio&#xff0c;官方下载 就好了。 2、然后就是使用 HBuilderX 离线打包,生成本地打包App资源。 打包好的文件路径在unpackage>resources>__UNI__XXX&#xff0c;这里的这个__UNI__XXX就待会需要的。 3、再准备HBuilder最新的SDK下载好 原生开…