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

Posted 梦想橡皮擦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022年记一次慢查询优化指南,MySQL 优化学习第9天相关的知识,希望对你有一定的参考价值。

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

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

学习要点

⛳️ 实战场景

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

准备工作

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

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

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

show variables like 'long_query_time';

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

🌸慢查询相关参数

  • 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';

除了直接在数据库中进行修改以外,也可以直接在 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 ........;

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

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

⛳️ 慢日志优化

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

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

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

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

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

🌞第三步,查看需要优化 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》⭐️ ⭐️

以上是关于2022年记一次慢查询优化指南,MySQL 优化学习第9天的主要内容,如果未能解决你的问题,请参考以下文章

线上Case分析一次慢查询优化及总结思考

记一次mysql性能优化过程

记一次mysql多表查询(left jion)优化案例

故障案例 | 一次慢SQL优化分析全过程

记一次MySql优化问题

记一次mysql查询慢的优化历程