2022年记一次慢查询优化指南,MySQL 优化学习第9天

举报
梦想橡皮擦 发表于 2022/03/24 23:28:16 2022/03/24
【摘要】 📢📢📢📢📢📢 哈喽!大家好,我是 【梦想橡皮擦】,10年产研经验,致力于 Python 相关技术栈传播💗 🌻本文如果觉得不错,动动小手点个赞赞吧👍 🌻本文如果发现错误,欢迎在评论...

📢📢📢📢📢📢
哈喽!大家好,我是 【梦想橡皮擦】,10年产研经验,致力于 Python 相关技术栈传播💗
🌻本文如果觉得不错,动动小手点个赞赞吧👍
🌻本文如果发现错误,欢迎在评论区中指正哦💗
🌸感谢各位大大大大哥🌸
📣📣📣📣📣📣

欢迎大家订阅专栏 ⭐️ ⭐️ 《Python爬虫120》⭐️ ⭐️

在这里插入图片描述

⛳️ 实战场景

有时候编写完的代码,上传到服务器,立马 CPU 与 负载跑满,查询原因之后,发现是 MySQL 慢查询导致,顾需要对慢查询进行调优。

准备工作

优化慢查询,那首先要做的就是配置慢查询日志。

MySQL 慢查询,全名是慢查询日志,用来记录 MySQL 的响应时间超过阈值的语句。具体环境中,就是超过 long_query_time 设置值的语句。

查询 long_query_time 是否开启,该值默认一般设置为 10.

show variables like 'long_query_time';

  
 
  • 1

2022年记一次慢查询优化指南,MySQL 优化学习第9天

如果不是为了调优操作,该日志可以关闭,毕竟开启查询日志记录还是会带来性能影响。

🌸慢查询相关参数

  • slow_query_log:1是开启,0是关闭;
  • slow-query-log-file:MySQL 数据库慢查询日志存储路径;
  • long_query_time:慢查询阈值,即超过多少分钟后记录日志;
  • log_queries_not_using_indexes:是否记录未使用索引的查询;
  • log_output:日志存储方式,默认值是 FILE,表示文件,也可以修改为 TABLE 表示存储到数据库。

查询上述参数值的语句如下所示:

show variables like 'slow_query_log';
show variables like 'long_query_time';
show variables like 'log_queries_not_using_indexes';
show variables like 'log_output';
show variables like 'slow-query-log-file';

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

除了直接在数据库中进行修改以外,也可以直接在 my.ini 文件中进行修改。

打开系统生成的慢日志文件,具体如下所示:

# Time: 2022-03-23T02:37:43.435138Z
# User@Host: root[root] @ localhost [127.0.0.1]  Id: 6917272
# Query_time: 60.214801  Lock_time: 0.000036 Rows_sent: 1  Rows_examined: 600413
SET timestamp=1648003063;
SELECT COUNT(*) AS ........;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

其中具体的参数说明如下所示:

  • Time:日志记录时间;
  • User @Host:MySQL登录的用户和登录的主机地址;
  • Query_time:第一个参数值是查询时间,第二个是锁表时间,第三个是返回行数,第四个是扫描行数;
  • SET timestamp:MySQL 查询时间戳;
  • 最后是 SQL 语句。

⛳️ 慢日志优化

🌞第一步,优化索引
接下来就可以使用 explain 关键字对查询进行优化了。
首先将 where 条件中的部分参数增加索引,下面是优化前和优化后的对比图,可以明显看到扫描行数 rows 降低。

2022年记一次慢查询优化指南,MySQL 优化学习第9天

2022年记一次慢查询优化指南,MySQL 优化学习第9天

此时首先要注意的就是索引是否起作用,如果没有设置索引或者索引失效,及时清理和解决。

适当的时候,可以建立复合索引。

🌞第二步,优化数据库表结构

拆解大表,如果表中的字段特别多,并且某些字段使用频率低,可以将其拆解出去形成新表
增加中间表,如果几个表经常被联合查询,可以建立中间表,将对应的数据进行插入,后续将联合查询修改为对中间表的查询。

🌞第三步,查看需要优化 LIMIT 分页
这里唯一需要注意的就是 LIMIT M, N 中的偏移量问题,即 M 值过大的问题。

🌞第四步,设置小表驱动大表

🌞第五步,order by 关键字优化

排序尽量使用索引排序,避免出现 filesort 方式
实现此逻辑的前提

  • order by 语句使用索引左置;
  • where 语句也使用索引左置。

🌞第六步,group by 关键字优化
group by 实质是先排序后分组,所以其也遵循索引左置原则。
一般优化是增大 max_length_for_sort_data +增大 sort_buffer_size
还有一点注意的是能 where 解决的筛选,就不要用 having。

🌞总结一下一般优化流程

  1. 开启慢日志,至少运行一天,要生产慢日志,时间阈值设置好;
  2. explain + 慢日志分析;
  3. show profile 分析,查询SQL执行细节;
  4. MySQL 服务器调优。

🌻本文如果发现错误,欢迎在评论区中指正哦💗
🌸感谢各位大大大大哥🌸
📣📣📣📣📣📣
橡皮擦的第 596 篇原创博客。

欢迎大家订阅专栏 ⭐️ ⭐️ 《Python爬虫120》⭐️ ⭐️

在这里插入图片描述

文章来源: dream.blog.csdn.net,作者:梦想橡皮擦,版权归原作者所有,如需转载,请联系作者。

原文链接:dream.blog.csdn.net/article/details/123681016

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。