慢 SQL 的优化思路

分析慢 SQL

如何定位慢 SQL 呢?

可以通过 slow log 来查看慢SQL,默认的情况下,MySQL 数据库是不开启慢查询日志(slow query log)。所以我们需要手动把它打开。

查看下慢查询日志配置,我们可以使用 show variables like 'slow_query_log%' 命令,如下:

  • slow query log:表示慢查询开启的状态。
  • slow_query_log_file:表示慢查询日志存放的位置。

还可以使用 show variables like 'long_query_time' 命令,查看超过多少时间,才记录到慢查询日志,如下:

  • long_query_time:表示查询超过多少秒才记录到慢查询日志。

可以通过慢查询日志,定位那些执行效率较低的 SQL 语句,重点关注分析。

explain 查看分析 SQL 的执行计划

当定位出查询效率低的 SQL 后,可以使用 explain 查看 SQL 的执行计划。

当 explain 与 SQL 一起使用时,MySQL 将显示来自优化器的有关语句执行计划的信息。即 MySQL 解释了它将如何处理该语句,包括有关如何连接表以及以何种顺序连接表等信息。

一条简单SQL,使用了explain的效果如下:

一般来说,我们需要重点关注id、type、key、rows、filtered、extra。

profile 分析执行耗时

explain 只是看到 SQL 的预估执行计划,如果要了解SQL真正的执行线程状态及消耗的时间,需要使用 profiling。开启 profiling 参数后,后续执行的SQL语句都会记录其资源开销,包括IO、上下文切换、CPU、内存等等,我们可以根据这些开销进一步分析当前慢 SQL 的瓶颈再进一步进行优化。

profiling 默认是关闭的,我们可以使用 show variables like '%profil%' 查看是否开启,如下:

可以使用 set profiling=ON 开启。开启后,可以运行几条 SQL,然后使用 show profiles 查看一下:

show profiles会显示最近发给服务器的多条语句,条数由变量profiling_history_size定义,默认是 15。如果我们需要看单独某条 SQL 的分析,可以show profile查看最近一条 SQL 的分析。也可以使用show profile for query id(其中 id 就是 show profiles 中的 QUERY_ID)查看具体一条的 SQL 语句分析。

除了查看 profile ,还可以查看 cpu 和 io,如上图。

Optimizer Trace 分析详情

profile 只能查看到 SQL 的执行耗时,但是无法看到 SQL 真正执行的过程信息,即不知道 MySQL 优化器是如何选择执行计划的。这时候还可以使用 Optimizer Trace,它可以跟踪执行语句的解析优化执行的全过程。

可以使用 set optimizer_trace="enabled=on" 打开开关,接着执行要跟踪的 SQL,最后执行 select * from information_schema.optimizer_trace 跟踪,如下:

大家可以查看分析其执行树,会包括三个阶段:

  • join_preparation:准备阶段
  • join_optimization:分析阶段
  • join_execution:执行阶段

由于 trace 中的内容太长,就不贴出来了。

采取措施

  • 多数慢 SQL 都跟索引有关,比如不加索引、索引不生效、不合理等,这时候,我们可以优化索引。
  • 优化 SQL 语句,比如一些 in 元素过多问题(分批),深分页问题(基于上一次数据过滤等),进行时间分段查询。
  • SQl 若不能继续优化时可以改用 ES 的方式,或者数仓。
  • 如果单表数据量过大导致慢查询,则可以考虑分库分表。
  • 如果数据库在刷脏页导致慢查询,考虑是否可以优化一些参数。
  • 如果存量数据量太大,考虑是否可以让部分数据归档。

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

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

相关文章

【算法Hot100系列】外观数列

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

OpenHarmony4.0Release系统应用常见问题FAQ

前言 自OpenHarmony4.0Release发布之后,许多小伙伴使用了配套的系统应用源码以及IDE作为基线开发,也遇到了各种各样的问题,这篇文档主要收录了比较常见的一些问题解答。 FAQ 系统应用源码在哪 目前OpenHarmony系统应用分为3种模式&#x…

DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS (Paper reading)

DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS Zhifeng Kong, Computer Science and Engineering, UCSD, ICLR2021, Code, Paper 1. 前言 在这项工作中,我们提出了DiffWave,这是一种用于条件和无条件波形生成的多功能扩散概率模型。该模…

全志V853开发板硬件开发用户入门指南

本章节将介绍V853开发板上各模块的基础使用方法。 V853开发板集成了LED、WiFi、蓝牙、以太网、音频、屏幕、USB、TF卡等模块。本章节将对这些模块进行简单的操作介绍,方便开发者快速上手了解开发板。 *注: 本文中 rootTinaLinux:~# 开头的命令是在开发…

初识C语言·内存函数

1 memcpy的使用和模拟实现 紧接字符串函数,出场的是第一个内存函数memcpy。前面讲的字符串函数是专门干关于字符串的事的,而这个函数可以干strcpy一样的事,但是区别就是它碰到\0也会继续复制。 函数的头文件是string,返回类型是v…

了解PyTorch中的缩放点积注意力及演示

torch.nn.functional.scaled_dot_product_attention 函数在 PyTorch 框架中用于实现缩放点积注意力(Scaled Dot-Product Attention)。这是一种在自然语言处理和计算机视觉等领域常用的注意力机制。它的主要目的是通过计算查询(query&#xff…

Java-网络爬虫(三)

文章目录 前言一、爬虫的分类二、跳转页面的爬取三、网页去重四、综合案例1. 案例三 上篇:Java-网络爬虫(二) 前言 上篇文章介绍了 webMagic,通过一个简单的入门案例,对 webMagic 的核心对象和四大组件都做了简要的说明,以下内容…

数据聚合、自动补全、数据同步、es集群

目录 数据聚合 聚合的分类 DSL实现bucket聚合 DSL实现Metrics聚合 RestAPI实现聚合 多条件聚合 带过滤条件的聚合 自动补全 安装拼音分词器 自定义分词器 completion suggester查询 修改索引库数据结构 RestAPI实现自动补全查询 实现搜索框自动补全 数据同步 数…

数据库读写分离设计方案

一、什么是读写分离 数据库读写分离是一种架构模式,其中数据库系统被配置为将读操作(查询)和写操作(插入、更新、删除)分别路由到不同的数据库实例或节点。读操作通常由从节点(或只读节点)处理&…

自动化测试框架pytest系列之21个命令行参数介绍(二)

第一篇 : 自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 接上文 3.pytest功能介绍 3.1 第一条测试用例 首先 ,你需要编写一个登录函数,主要是作为被测功能,同时编写一个测试脚本 ,进行测试登录功能 。 登…

视频转为序列图的软件,让视频批量转为序列图

你是否曾经遇到过这样的困境:需要将一段视频转为一系列的图片,但却没有合适的工具来完成?或许你曾经手动截图,或者用其他方式,但结果往往不尽如人意,图片质量差、色彩失真、画面不清晰。现在,让…

建议收藏!2023首获中科院分区期刊目录

2023年12月27日,中科院分区正式发布《2023年中国科学院文献情报中心期刊分区表》。今年期刊分区表包括SCIE、SSCI、A&HCI,以及ESCI中国期刊,共设置了包括自然科学、人文科学和社会科学在内的21个大类。 相比之前,中科院分区今…