前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL慢查询:慢SQL定位、日志分析与优化方案,真心不错!

MySQL慢查询:慢SQL定位、日志分析与优化方案,真心不错!

作者头像
芋道源码
发布于 2022-06-07 03:52:44
发布于 2022-06-07 03:52:44
86300
代码可运行
举报
文章被收录于专栏:芋道源码1024芋道源码1024
运行总次数:0
代码可运行

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

来源:blog.csdn.net/qq_32828253/

article/details/109526742/


一个sql执行很慢的就叫慢sql,一般来说sql语句执行超过5s就能够算是慢sql,需要进行优化了

为何要对慢SQL进行治理

每一个SQL都需要消耗一定的I/O资源,SQL执行的快慢直接决定了资源被占用时间的长短。假设业务要求每秒需要完成100条SQL的执行,而其中10条SQL执行时间长导致每秒只能完成90条SQL,所有新的SQL将进入排队等待,直接影响业务

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

治理的优先级

master数据库->slave数据库:采用读写分离架构,读在从库slave上执行,写在主库master上执行。但由于从库的数据都是在主库复制过去的,主库如果等待较多的情况,会加大从库的复制延时

执行SQL次数多的优先治理

某张表被高并发集中访问的优先治理

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。 项目地址:https://github.com/YunaiV/onemall

MySQL执行原理

为了更好的优化慢SQL,我们来简单了解下MySQL的执行原理

绿色部分为SQL实际执行部分,主要分为两步:

解析:词法解析->语法解析->逻辑计划->查询优化->物理执行计划,过程中会检查缓存是否可用,如果没有可用缓存则进入下一步mysql_execute_command执行

执行:检查用户、表权限->表加上共享读锁->取数据到query_cache->取消共享读锁

如何发现慢查询SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 修改慢查询时间,只能当前会话有效;
set long_query_time=1; 
-- 启用慢查询 ,加上global,不然会报错的;
set global slow_query_log='ON'; 
-- 是否开启慢查询;
show variables like "%slow%"; 
-- 查询慢查询SQL状况;
show status like "%slow%";  
-- 慢查询时间(默认情况下MySQL认位10秒以上才是慢查询)
show variables like "long_query_time";  

除了sql的方式,我们也可以在配置文件(my.ini)中修改,加入配置时必须要在[mysqld]后面加入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 开启日志;
slow_query_log = on  
-- 记录日志的log文件(注意:window上必须写绝对路径)
slow_query_log_file = D:/mysql5.5.16/data/showslow.log 
-- 最长查询的秒数;
long_query_time = 2  
-- 表示记录没有使用索引的查询
logqueriesnotusingindexes  

开启慢查询会带来CPU损耗与日志记录的IO开销,所以建议间断性的打开慢查询日志来观察MySQL运行状态

慢查询分析示例

假设我们有一条SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM `emp` where ename like '%mQspyv%'; 

执行时间为1.163s,而我们设置的慢查询时间为1s,这时我们可以打开慢查询日志进行日志分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Time: 150530 15:30:58  -- 该查询发生在2015530 15:30:58
# User@Host: root[root] @ localhost [127.0.0.1]  --是谁,在什么主机上发生的查询
# Query_time: 1.134065 Lock_time: 0.000000 Rows_sent: 8 Rows_examined: 4000000 Query_time: --查询总共用了多少时间,Lock_time: 在查询时锁定表的时间,Rows_sent: 返回多少rows数据,Rows_examined: 表扫描了400W行数据才得到的结果;

如果我们的慢SQL很多,人工分析肯定分析不过来,这时候我们就需要借助一些分析工具,MySQL自带了一个慢查询分析工具mysqldumpslow,以下是常见使用示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysqldumpslow s c t 10 /var/run/mysqld/mysqldslow.log # 取出使用最多的10条慢查询
mysqldumpslow s t t 3 /var/run/mysqld/mysqldslow.log # 取出查询时间最慢的3条慢查询
mysqldumpslow s t t 10 g “left join” /database/mysql/slowlog #得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow s r t 10 g 'left join' /var/run/mysqld/mysqldslow.log # 按照扫描行数最多的

SQL语句常见优化

只要简单了解过MySQL内部优化机制,就很容易写出高性能的SQL

1.不使用子查询:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');

在MySQL5.5版本中,内部执行计划器是先查外表再匹配内表,如果外表数据量很大,查询速度会非常慢

在MySQL5.6中,有对内查询做了优化,优化后SQL如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;

但也仅针对select语句有效,update、delete子查询无效,所以生成环境不建议使用子查询

2.避免函数索引
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t WHERE YEAR(d) >= 2016;

即使d字段有索引,也会全盘扫描,应该优化为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t WHERE d >= '2016-01-01';
3.使用IN替换OR
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;

非聚簇索引走了3次,使用IN之后只走一次:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t WHERE LOC_IN IN (10,20,30);
4.LIKE双百分号无法使用到索引
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t WHERE name LIKE '%de%';

应优化为右模糊

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t WHERE name LIKE 'de%';
5.增加LIMIT M,N 限制读取的条数
6.避免数据类型不一致
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t WHERE id = '19';

应优化为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM t WHERE id = 19;
7.分组统计时可以禁止排序
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT goods_id,count(*) FROM t GROUP BY goods_id;

默认情况下MySQL会对所有GROUP BY co1,col2 …的字段进行排序,我们可以对其使用ORDER BY NULL禁止排序,避免排序消耗资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;
8.去除不必要的ORDER BY语句

总结

总的来说,我们知道曼查询的SQL后,优化方案可以做如下尝试:

  • SQL语句优化,尽量精简,去除非必要语句
  • 索引优化,让所有SQL都能够走索引
  • 如果是表的瓶颈问题,则分表,单表数据量维持在1000W以内
  • 如果是单库瓶颈问题,则分库,读写分离
  • 如果是物理机器性能问题,则分多个数据库节点


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、RedisMongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
帝国cms调用缩略图和具体文章的方法
  我们在用帝国cms建站的时候经常会在首页或者分类页等调用一些文章,如果文章带有展示图也把图片调用出来。帝国cms调用缩略图和具体文章怎么操作呢?我们用帝国cms的灵动标签[e:loop],只要记住
ytkah
2018/03/05
2.2K0
帝国cms调用缩略图和具体文章的方法
帝国cms支持的变量及灵动标签变量汇总
  帝国CMS对首页、列表页、内容页这三个页面模板支持的变量是不同的,有的是通用的,有的不是通用的,本文就这三个模板常用的变量列于此,另外灵动标签很好用啊,也顺便收藏于此,以备后用,到时不用到处翻来翻去的。
ytkah
2018/12/17
1.9K0
帝国CMS灵动标签如何调用标题属性和截取标题字数?(代码示例)
一,帝国cms灵动标签截取标题字数的方法: 将上面的换成,这里面的30代表字节数,也就是显示15个汉字 二,帝国cms灵动标签显示标题属性的方法:
用户7639835
2021/10/13
1.5K0
帝国CMS怎么利用灵动标签循环调用多个栏目下的文章
今天给做网站的时候,首页需要调用多个栏目的文章,在这里记录下 代码如下: [e:loop={"1,2,3",30,0,0,'','newstime DESC'}] <li><a href="<?=
夏末浅笑
2020/10/20
2K0
帝国CMS怎么利用灵动标签循环调用多个栏目下的文章
typecho缩略图加入根据标签缩略名输出缩略图
做出来的效果就是: 缩略图显示,依次是附件中的图片,若不存在,输出文章的第一张图片,若不存在,输出对应的tag缩略名图片,若是未配置的tag,则输出随机图片,若文章不存在tag,则输出随机图片。
泽泽社长
2023/04/17
1.5K0
DEDECMS织梦上一篇下一篇自由可控输出链接、标题、缩略图、时间
在不影响程序原来功能的基础下,二次开发让上一篇下一篇标签自由可控地输出链接、标题、缩略图、时间,没有上一篇或者下一篇时不输出任何东西
用户9841292
2022/07/15
1.2K0
DEDECMS织梦上一篇下一篇自由可控输出链接、标题、缩略图、时间
dedecms标签调用大全
发布的文章显示红色日期或加上new字或new小图片给近三天(或当天)发布的文章显示红色日期或加上new字或new小图片等。 都是围绕pubdate做文章,写扩展的。 第2、3要注意的问题是:如:
小唐同学.
2022/02/23
57.1K0
eyoucms标签高级用法
{eyou:memberinfos mid='$eyou.field.users_id' id='users'}
IT工作者
2023/07/23
1.2K0
wordpress中提取文章内第一张图片作为缩略图
作者:matrix 被围观: 1,059 次 发布时间:2013-09-04 分类:Wordpress 兼容并蓄 | 无评论 »
HHTjim 部落格
2022/09/26
4560
wordpress中提取文章内第一张图片作为缩略图
JEECMS v6版标签
S:截取字符串长度 len:保留字符的长度 append:保留字段以后的追加字符以。。。。显示 作用:截取过长的字符串,如标题标题太长了可以。。。。表示 具体例子: [@cms_content_list channelId='60' count='5' titLen='20' append='...' channelOption='1' dateFormat='yyyy-MM-dd'] [#list tag_list as a] <li><a href="${a.url}" target=_blank>[@text_cut s=a.title len=titLenappend=append/]</a></li> [/#list] [/@cms_content_list] JEECMS v6版标签之[@cms_friendink_list] 标签介绍 参数详解 ctgId:链接类别 siteId:站点ID enabled enabled:是否显示 作用:显示友情链接 文字链接 [@cms_friendlink_list ctgId='1'] [#list tag_list as link] <div style="margin-left:1.5%; float:left;"> <a href="${link.domain}" οnclick="$.get('${base}/friendlink_view.jspx?id=${link.id}')"target="_blank">${link.name}</a> </div> [/#list] [/@cms_friendlink_list] 图片链接 [@cms_friendlink_list ctgId='2'] [#list tag_list as link] <li><a href="${link.domain}" target="_blank" οnclick="$.get('${base}/friendlink_view.jspx?id=${link.id}')"> <imgsrc="${link.logo!site.defImg}" alt="${link.name}"/> </a></li>[/#list] [/@cms_friendlink_list] JEECMS v6版标签之[@cms_Tag_list] 参数详解 count:显示个数 作用:显示tag列表 具体例子: <div align="center" style="font-size:20px;color:red"> 热门tags: [@cms_tag_list count='8'] [#list tag_list as tag]<a href="${base}/tag/${tag.id}.jspx" target="_blank">${tag.name}</a>[#if tag_has_next]|[/#if][/#list] [/@cms_tag_list] <div> JEECMS v6版标签之[@cms_lucene_page] 搜索结果分页标签 参数详解 q: 搜索关键字 siteId:站点ID channeled:栏目ID startDate::开始时间 endDate:结束时间 作用:对搜索结果分页 具体例子: <div class="w96" style="min-height:500px;"> [#if q??] [@cms_lucene_page q=q channelId=channelId descLen='100' append='...' count='4' sysPage='1' ] <div class="search_msg"> 您搜索的<span class="red">“${q!}”</span>,共有<span class="red">${tag_list?size} 条</span>查询结果,[@process_time/] </div> [#list tag_list as s] <dl class="list3"> <dt><span>[<a href="${s.ctgUrl}" target="_blank">${s.ctgName}</a>]</span> <a href="${s.url}" title="${s.title}" target="_blank">${s.title}</a></dt> <dd class=
六月的雨在Tencent
2024/03/28
1280
分享WordPress各种标签大全集合 以及如何调用
wordpress程序日渐成熟,开发者越来越多,各种模版层出不穷,但是想要做一个好的wordpress模版,前提不只是要掌握HTML5前端技术,还必须了解wordpress的各种标签如何调用才可以。今天全百科网就把整理的WordPress各种标签以及是如何调用分享给大家。
于飞云计算
2019/07/22
3.3K0
分享WordPress各种标签大全集合 以及如何调用
一篇文带你从0到1了解建站及完成CMS系统编写
文章为从0到1了解内容管理系统搭建与编写,由于一篇文章内容篇幅过长,文章内容经过压缩,该项目中相同逻辑的实现只以一个实例作为描述,主要以核心关键功能的开发作为主要的讲解步骤。如有想学习完整内容系统编写可在留言区留言,我会尽快完成完整版的实战教程发布。谢谢。本篇不涉及vue、nodejs的前端框架。
1_bit
2020/10/29
3.3K0
一篇文带你从0到1了解建站及完成CMS系统编写
begin主题使用说明(详解教程)
主题有些功能会用到文章点击量,所以必须安装文章点击统计插件:wp-postview,也可后台搜索安装官方最新版。
爱游博客
2019/08/07
5.1K0
begin主题使用说明(详解教程)
Z-BlogPHP开运锦鲤前来报道(更新说明及操作教程,必看文章)
历时一个多月的锦鲤主题,终于完成了。2019首发Z-blogPHP锦鲤主题模板(Koilee · 开运锦鲤),部分模块移植WP主题,目前主题已经完善,主题简洁、大气,适合个人博客及文章写作等,先介绍主题吧。
雾海梦曦
2022/11/04
3.5K0
Z-BlogPHP开运锦鲤前来报道(更新说明及操作教程,必看文章)
Typecho Paul Theme QA
前几天在 Typecho.me 这个主题站提交了这个主题,最近有很多人下载使用这个主题。首先这个主题使用上是完全没有问题的,本人从 7 月开发完成后使用至今并没有碰到功能上的 Bug。但是最近却有很多人产生了无数个 Bug。
Innei
2021/12/28
6430
Typecho语法大全/Typech常用函数/Typecho调用方法
32、导航页面列表调用隐藏特定的页面 这个演示隐藏了 al­bum 和 search 两个页面
目的地-Destination
2023/03/06
2K0
本站同款宁静致远(Quietlee)自媒体博客主题模板,夜间模式及强大的SEO效果-ZBlog主题
宁静致远(Quietlee)自媒体博客、新闻、资讯互动类主题模板及强大的SEO优化效果,此款主题源自《小灯泡设计》,移植TY程序的Spimes主题,致敬原作者,这是一款非常nice的主题模板,风格简约,兼容多媒体移动端显示,拥有独立的分享代码,不在依赖百度(想依赖也不行,百度分享官网都挂了),支持一键生成海报模式,还移植了源主题模板的阅读模式,优化了夜间模式代码,增加了网站首页底部CMS列表模块,后台自带开关,更多功能介绍请听我一一道来。
雾海梦曦
2022/11/04
3.4K0
本站同款宁静致远(Quietlee)自媒体博客主题模板,夜间模式及强大的SEO效果-ZBlog主题
基于 Hexo 从零开始搭建个人博客(五)
修改网站各种资料,例如标题、副标题和邮箱等个人资料,请修改站点配置文件_config.yml。部分参数如下,详细参数可参考官方的配置描述。
唐志远
2022/10/27
1.2K0
基于 Hexo 从零开始搭建个人博客(五)
记一次较为详细的某CMS代码审计
Seay的话它可以很方便的查看各个文件,而昆仑镜可以很快且扫出更多的漏洞点,将这两者进行结合起来,就可以发挥更好的效果。
红队蓝军
2023/09/13
7460
记一次较为详细的某CMS代码审计
Butterfly安装文档(三)主题配置-1
修改网站各种资料,例如标题、副标题和邮箱等个人资料,请修改博客根目录的_config.yml
程序员朱永胜
2023/08/21
5750
Butterfly安装文档(三)主题配置-1
推荐阅读
相关推荐
帝国cms调用缩略图和具体文章的方法
更多 >
LV.0
上海君之维科技有限公司培训师
目录
  • 为何要对慢SQL进行治理
  • 治理的优先级
  • MySQL执行原理
  • 如何发现慢查询SQL
  • 慢查询分析示例
  • SQL语句常见优化
    • 1.不使用子查询:
    • 2.避免函数索引
    • 3.使用IN替换OR
    • 4.LIKE双百分号无法使用到索引
    • 5.增加LIMIT M,N 限制读取的条数
    • 6.避免数据类型不一致
    • 7.分组统计时可以禁止排序
    • 8.去除不必要的ORDER BY语句
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档