Mysql技术文档--慢mysql的优化--工作流--按步排查

这里是用来发现慢sql的一个好方法 --by.阿丹

Prometheus-监控Mysql进阶用法(1)(安装配置)_一单成的博客-CSDN博客

阿丹:

        知道了慢sql的语句那么就开始按照优化步骤对sql进行排查和优化。

1、阅读sql逻辑

首先观察sql语句的书写,整理sql的逻辑。

分别sql查询层级。

2、使用explain查看执行计划

在按照执行计划中的参数来进行优化:

(1)根据type来进行优化

在MySQL中,explain命令提供了有关查询执行计划的详细信息,其中type列描述了查询的访问方法。在type列中,从高到低,常见的访问方法级别包括:

  1. system:这是最高级别的访问方法,通常只会有一条记录,表示表只有一行。例如,对于查询全局变量的操作,MySQL可能使用system级别。

  2. const:这表示查询在表中只匹配一行数据,通常是由于使用了主键或唯一索引进行精确匹配。

  3. eq_ref:在连接查询中,这是最有效的访问方法之一,表示在连接时表之间的关联是基于一个唯一索引。

  4. ref:表示使用非唯一索引进行查询,返回匹配某个值的多个行。

  5. fulltext:这表示使用全文索引进行查询。

  6. ref_or_null:类似于ref,但还包括返回NULL值的行。

  7. index_merge:表示使用多个索引进行查询,并通过合并结果来获得最终的结果。

  8. unique_subquery:这表示在子查询中使用了唯一索引来查询。

  9. index_subquery:类似于unique_subquery,但是使用的是非唯一索引。

  10. range:表示使用索引范围进行查询,例如使用BETWEENIN操作符。

  11. index:这表示全索引扫描,即遍历整个索引树。

  12. all:这是最低级别的访问方法,表示全表扫描,即遍历整个表。

请注意,这些查询访问方法并非严格按照从高到低的顺序,而是根据查询的特点和优化器的决策来确定的。不同的查询可能会使用不同的访问方法。

注意:

        最少是要在range以上才能够达到上生产环境的条件。

优化措施-加索引

注意:索引失效的原因排查

在 MySQL 中,索引可能会失效的几个常见原因包括:

  1. 数据较少:如果表中的数据量较小,索引可能会变得不那么有效,因为对于小表而言,全表扫描可能比使用索引更快。

  2. 不适当的索引选择:选择不当的索引类型或未正确地创建适合查询的索引,可能导致索引失效。例如,当查询涉及到对索引列进行函数操作,或者使用OR操作符连接多个条件时,索引可能无法被有效利用。

  3. 字符串列过长:如果使用了较长的字符串列作为索引,未能适当地截断或使用前缀索引,也可能导致索引失效。

  4. 数据分布不均匀:如果表中的数据分布不均匀,某些索引可能会较少覆盖查询条件,导致索引失效。

  5. 统计信息过期:MySQL 使用统计信息来决定如何使用索引,如果统计信息过期或不准确,优化器可能无法正确地选择合适的索引,导致索引失效。

  6. 查询使用了函数操作:当查询使用函数操作时,例如对索引列进行函数操作或使用函数作为查询条件,索引可能无法被有效利用,导致索引失效。

  7. 隐式数据类型转换:如果查询中的条件类型与索引列的数据类型不匹配,MySQL 会进行隐式的数据类型转换,导致索引失效。

  8. 看添加索引的列是不是参与了计算。

为了避免索引失效,需要正确地设计和创建索引,并根据查询的特点进行优化。此外,定期更新统计信息,避免使用函数操作或隐式数据类型转换,也有助于提高索引的效率和准确性。

使用sql语句创建索引
CREATE INDEX 索引名 ON 表名(对应表中的列);

它创建了一个普通索引。在 MySQL 中,可以使用以下语句来创建不同类型的索引:

  1. 普通索引(Normal Index):使用 CREATE INDEX 语句来创建。例如:CREATE INDEX index_name ON table_name(column_name);

  2. 唯一索引(Unique Index):使用 CREATE UNIQUE INDEX 语句来创建。例如:CREATE UNIQUE INDEX index_name ON table_name(column_name);

  3. 主键索引(Primary Key Index):使用 ALTER TABLE 语句来添加主键。例如:ALTER TABLE table_name ADD PRIMARY KEY (column_name);

  4. 全文索引(Full-Text Index):使用 ALTER TABLE 语句来添加全文索引。例如:ALTER TABLE table_name ADD FULLTEXT(column_name);

  5. 聚簇索引(Clustered Index):聚簇索引在 MySQL 中是通过主键索引实现的,通过创建主键自动创建聚簇索引。

CREATE CLUSTERED INDEX idx_clustered_index_name
ON table_name (column1, column2, ...);

就你的具体示例而言,CREATE INDEX idx_orders_date ON orders(orderdate); 创建了一个普通索引,名称为 idx_orders_date,用于 orders 表上的 orderdate 列。

要创建索引,你可以使用 CREATE INDEX 语句,指定索引名称、表名和要建立索引的列名。确保你在建立索引时考虑查询的需要和数据的分布,以便获得最佳的查询性能。

重构sql语句

场景一:

原:

改:

如图因为在之前的sql中即便是创建了索引但是还是因为参与了函数计算所以导致索引的失效,那么这里就使用更改sql语句书写的方式来将该列拿出来。

同时注意使用聚簇索引来避免回表就可以了。

避免回表

使用覆盖索引->在创建索引的时候直接将需要的数据的列直接与索引绑定,这样在指针寻找的时候就可以直接找到相应的数据来避免回表。

在执行计划中,可以在possible_keys属性中看到,有相关的索引,然后在key属性中可以看到具体使用的索引。

(2)根据Extra发现问题

EXPLAIN 查询结果中,属性 Extra 提供了关于执行计划中其他相关信息的附加细节。它可以提供有关查询执行过程中发生的特定操作或优化选项的信息。 Extra 属性通常用于说明执行计划中的一些重要细节或特殊情况。

以下是一些常见的 Extra 属性及其含义:

  • Using index: 表示查询使用了覆盖索引,即查询只通过索引就可以返回所需的数据,而无需进一步访问表本身。
  • Using where: 表示查询使用了 WHERE 子句进行条件过滤。
  • Using temporary: 表示查询需要创建一个临时表来处理查询中的某些操作,如排序或分组。
  • Using filesort: 表示查询需要对结果进行排序,但无法通过索引完成排序,因此需要使用文件排序算法。
  • Using join buffer (Block Nested Loop): 表示查询使用了连接缓冲区(BNL)算法来处理连接操作。
  • Using index condition: 表示查询使用了索引条件推送优化,即在索引上进行条件过滤。

这些只是一些常见的 Extra 属性,实际上还有其他可能的属性值,具体取决于数据库管理系统和查询的复杂性。理解 Extra 属性可以帮助您分析查询的执行计划并识别潜在的性能问题或优化机会。

针对属性的值优化思路:

根据 Extra 属性的信息,您可以考虑以下优化方法:

  1. Using index: 如果查询使用了覆盖索引,这通常是一个好的迹象。确保相应的列上有适当的索引,并检查索引的覆盖程度是否满足查询需求。

  2. Using where: WHERE 子句用于条件过滤,这有助于减少返回结果集的大小。确保相关列上有合适的索引,以提高条件过滤的效率。

  3. Using temporary: 创建临时表可能会对性能产生影响。考虑优化查询或调整查询结构,例如使用更有效的语句或重写查询,以避免临时表的创建。

  4. Using filesort: 文件排序操作可能会消耗大量计算资源。尽量通过优化查询或添加适当的索引来避免文件排序。可以考虑调整查询的 ORDER BY 语句,以便能够使用索引完成排序操作。

  5. Using join buffer (Block Nested Loop): 使用连接缓冲区(BNL)算法进行连接操作,但对于大型数据集可能会导致性能下降。在性能较差的情况下,可以尝试使用其他连接算法或调整查询中的连接条件。

  6. Using index condition: 索引条件推送优化可以提高查询性能。确保查询中的条件与索引的列匹配,并且索引的选择性较高。

此外,您还可以考虑以下通用的优化方法来提高查询性能:

  • 确保适当的索引存在,并根据查询需求创建或调整索引。
  • 对表进行分区或分片,以减少查询的数据量。
  • 优化查询语句,避免不必要的复杂性和重复操作。
  • 使用批量操作或合并多个查询以减少数据库访问次数。
  • 监控数据库的性能,并根据需要进行调整和优化。

最佳的优化策略取决于具体的数据库、表结构和查询模式。因此,在进行任何优化之前,建议先进行基准测试和性能分析,以了解具体的瓶颈和问题所在,然后有针对性地采取相应的优化措施。

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

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

相关文章

什么是 MyBatis?与 Hibernate 的区别

引言 在现代的应用程序开发中,与数据库的交互是至关重要的。为了简化数据库访问,许多开发者选择使用ORM(对象-关系映射)框架。MyBatis和Hibernate都是流行的ORM框架,它们可以帮助开发者更轻松地将Java对象映射到数据库…

OOTD | 美式复古穿搭耳机,复古轻便的头戴式耳机推荐

复古耳机更能带来年代感的复古数码产品,头戴式耳机就好似是时光滤镜的时髦配饰,不说功能实用性,在造型上添加就很酷。 随着时代的发展,时尚有了新的定义。对如今的消费者来说,时尚不仅是美学与个性的展现,…

【Spring篇】简述IoC入门案例,DI入门案例

🎊专栏【Spring】 🍔喜欢的诗句:天行健,君子以自强不息。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 文章目录 🎄Spring Framework系统架构🎆Spring核心概…

这可能是最全的反爬虫及应对方案,再也不怕爬不到数据了

一、什么是反爬虫 网络爬虫,是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。但是当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护。于是,很多网站开始…

asp.net core mvc Razor +dapper 增删改查,分页(保姆教程)

说明:本demo使用sqlserver数据库,dapper orm框架 完成一张学生信息表的增删改查,前端部分使用的是Razor视图, Linq分页 HtmlHelper。(代码随便写的,具体可以自己优化) //实现效果如下&#xff0…

服装服饰小程序商城的作用是什么

服装绝对算是市场重要的组成部分,零售批发都有大量从业者,随着线下流量匮乏、经营困难重重,很多厂家商家选择线上经营,主要方式是直播、入驻第三方平台等,同时私域节奏加快及线上平台限制等,不少商家也是通…

appscan的两种手动探索扫描方式

文章目录 一、使用火狐FoxyProxy浏览器代理探索二、使用appscan内置浏览器探索 一、使用火狐FoxyProxy浏览器代理探索 首先火狐浏览器需安装FoxyProxy 先在扩展和主题里搜FoxyProxy 选FoxyProxy Standard,然后添加到浏览器就行 添加后浏览器右上角会有这个插件 打开apps…

Linux系统下xxx is not in the sudoers file解决方法

文章目录 遇到问题解决方法参考 遇到问题 服务器上新建用户,名为lishizheng,现在想给该用户添加sudo权限。 $ sudo lsof -i tcp:7890 [sudo] password for lishizheng: lishizheng is not in the sudoers file. This incident will be reported.解决…

Go 语言内置类型全解析:从布尔到字符串的全维度探究

目录 一、布尔类型定义基础用法声明与初始化逻辑运算 进阶用法条件语句循环结构函数返回值 常见错误与陷阱 二、整数类型定义基础用法声明与初始化运算符位运算 进阶用法数据溢出类型转换类型推断 特殊整数类型runebyte 常见问题和陷阱 三、浮点数类型定义基础用法声明与初始化…

Junit的常用操作

注:本篇文章讲解的是junit5 目录 Juint是什么 Juint需要导入的依赖 Juint常用注解 Junit执行顺序 参数化 断言 测试套件 Juint是什么 Juint 是 Java 的一个单元测试框架. 也是回归测试框架. 使用 Junit 能让我们快速的完成单元测试。 注意:Junit 测试也是程序…

联合概率和条件概率的区别和联系

联合概率P(A∩B) 两个事件一起(或依次)发生的概率。 例如:掷硬币的概率是 ⁄₂ 50%,翻转 2 个公平硬币的概率是 ⁄₂ ⁄₂ ⁄₄ 25%(这也可以理解为 50% 的 50%) 对于 2 个硬币,样本空间将…

8章:scrapy框架

文章目录 scrapy框架如何学习框架?什么是scarpy?scrapy的使用步骤1.先转到想创建工程的目录下:cd ...2.创建一个工程3.创建之后要转到工程目录下4.在spiders子目录中创建一个爬虫文件5.执行工程setting文件中的参数 scrapy数据解析scrapy持久…

超市便利店批发零售小程序商城的作用是什么

超市便利店甚至是商场,所售卖的产品广而多,其线上线下商家数量也非常庞大,对传统超市便利店来说,往往会优先发力线下经营,然而随着互联网电商冲击,传统线下经营也面临:拓客引流难、产品销售难、…

子监督学习的知识点总结

监督学习 机器学习中最常见的方法是监督学习。在监督学习中,我们得到一组标记数据(X,Y),即(特征,标签),我们的任务是学习它们之间的关系。但是这种方法并不总是易于处理&…

Vue中如何进行拖拽与排序功能实现

在Vue中实现拖拽与排序功能 在Web应用程序中,实现拖拽和排序功能是非常常见的需求,特别是在管理界面、任务列表和图形用户界面等方面。Vue.js作为一个流行的JavaScript框架,提供了许多工具和库来简化拖拽和排序功能的实现。本文将介绍如何使…

算法:最近公共祖先(LCA)

有根树中,每一个点都有好几个祖先(在往根节点走的过程中遇到的都是它的祖先),一般化,把本身也称为它的祖先 对于两个点,离它们最近的一个公共祖先被称为最近公共祖先 法一:向上标记法&#xf…

Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)

目录 前言 运行结果: 运行截屏(p50e) apk文件 源码文件 项目结构 总览 MainActivity.java drawable 更改图标的方法: blackbutton.xml bluebuttons.xml greybutton.xml orangebuttons.xml whitebutton.xml layout 布…

Lagrange插值法实验:求拉格朗日插值多项式和对应x的近似值matlab实现(内附代码)

一、实验要求 已知函数表: 求出Lagrange 插值多项式,并计算x1.2处的y的近似值。 二、MATLAB代码 求解多项式: X input(请输入横坐标向量X:\nX); % 获取用户输入的横坐标向量 Y input(请输入纵坐标向量Y:\nY); % 获取用户输入的纵坐标…

简单走近ChatGPT

目录 一、ChatGPT整体背景认知 (一)ChatGPT引起关注的原因 (二)与其他公司的竞争情况 二、NLP学习范式的发展 (一)规则和机器学习时期 (二)基于神经网络的监督学习时期 &…

竞赛 机器学习股票大数据量化分析与预测系统 - python 竞赛

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…