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

news2024/12/24 5:46:51

这里是用来发现慢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.coloradmin.cn/o/1061773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧邮政:浅述视频监控与AI智能分析技术助力邮政物流智能监管

随着电子商务的蓬勃发展,我国的快递业务量也随之增长,邮政快递业的规模也在不断扩大。快递业务的迅猛发展促进了快递网点数量的爆发式增长,同时也带来了成本投入增加、服务质量下降等各种管理问题。快递企业每年因快递损毁、丢件等事件造成的…

棉花叶病害数据集

Bacterial Blight(细菌性枯萎病):细菌性枯萎病是由细菌引起的棉花疾病,主要受害部位是棉花的叶子和茎。这种病害可以导致叶片枯萎、变色和腐烂,对棉花产量产生不利影响。 Curl Virus(卷叶病毒)…

对比表:阿里云轻量应用服务器和服务器性能差异

阿里云服务器ECS和轻量应用服务器有什么区别?轻量和ECS优缺点对比,云服务器ECS是明星级云产品,适合企业专业级的使用场景,轻量应用服务器是在ECS的基础上推出的轻量级云服务器,适合个人开发者单机应用访问量不高的网站…

TF坐标变换

ROS小乌龟跟随 5.1 TF坐标变换 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 tf模块:在 ROS 中用于实现不同坐标系之间的点或向量的转换。 在ROS中坐标变换最初对应的是tf,不过在 hydro 版本开始, tf 被弃用,迁移到 tf2,后者更…

Flv.js编译使用

Flv.js (https://github.com/bilibili/flv.js)是 HTML5 Flash 视频(FLV)播放器,纯原生 JavaScript 开发,没有用到 Flash。由 bilibili 网站开源。本文讲述其编译使用。 Flv.js目前最新版本是v1.6.2。在htt…

《视觉 SLAM 十四讲》V2 第 5 讲 相机与图像

文章目录 相机 内参 && 外参5.1.2 畸变模型单目相机的成像过程5.1.3 双目相机模型5.1.4 RGB-D 相机模型 实践5.3.1 OpenCV 基础操作 【Code】OpenCV版本查看 5.3.2 图像去畸变 【Code】5.4.1 双目视觉 视差图 点云 【Code】5.4.2 RGB-D 点云 拼合成 地图【Code】 习题题…

美妆护肤品商城小程序的作用是什么?

化妆品几乎可以覆盖所有人群,各式各样的品牌及经销商非常多,主要销售模式为门店零售、线上入驻电商平台售卖、批发等,近些年随着电商发展迭代以及消费升级,对品牌或经销商来说,传统经营模式变得低效,每个人…

华为云云耀云服务器L实例评测|Uniapp开发部署茶叶商城小程序、H5

1、华为云云耀云服务器L实例评测|Uniapp开发茶叶商城小程序、H5 华为云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新轻量应用云服务器。多种产品规格,满足您对成本、性能及技术创新的诉求。云耀云服务器L实例提供丰富严选的应用镜像…

Spring Security 6.1.x 系列 (1)—— 初识Spring Security

一、 Spring Security 概述 Spring Security是Spring组织提供的一个开源安全框架,基于Spring开发,所以非常适合在Spring Boot中使用。 官方文档地址:https://docs.spring.io/spring-security/reference/index.html GitHub地址:…

抖音小店怎么运营?运营全流程,不懂的快来看!

我是电商珠珠 抖音小店是抖音旗下的电商平台,对于抖音来说流量是充足的,所以很多人想要在抖音小店上下功夫。 但是关于抖音小店的流程很多人还不太熟悉,今天我就来给大家详细的讲一下。 一、入驻准备 在入驻的时候,需要办理一…

lv7 嵌入式开发-网络编程开发 09 UDP通信

目录 1 用到的相关API 1.1 write/read到send/recv 1.2 sendto与recvfrom 2 UDP通信的实现过程 3 服务端代码、客户端、makefile代码实现 1 用到的相关API 1.1 write/read到send/recv send函数原型: ssize_t send(int sockfd, const void *buf, size_t len, …

Ubuntu MySQL

在安装前,首先看你之前是否安装过,如果安装过,但是没成功,就要先卸载。 一、卸载 1.查看安装 dpkg --list | grep mysql 有东西,就说明您之前安装过mysql。 2.卸载 先停掉server sudo systemctl stop mysql.servic…

基于回溯搜索优化的BP神经网络(分类应用) - 附代码

基于回溯搜索优化的BP神经网络(分类应用) - 附代码 文章目录 基于回溯搜索优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.回溯搜索优化BP神经网络3.1 BP神经网络参数设置3.2 回溯搜索算法应用 4.测试结果…

基于Java的飞机航班订票购票管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

使用appscan定时批量扫描方法

文章目录 一、批量扫描设置二、定时扫描设置 一、批量扫描设置 appscan的窗口模式中允许用户一次只能选择一个扫描目标,但是如果想批量扫描多个网站的时候可以通过appscan安装文件夹下的AppScanCMD.exe工具来操作,具体操作如下。 首先按常规操作添加2个…

2.2.2搭建交叉编译器

1 交叉编译器 交叉编译的存在,有2个原因,1个是不同的平台,架构不同,使用的指令集不同,ARM和MIPS的CPU无法运行X86指令休编码的程序,1个是一般arm平台上的存储/性能有限,无法提供一个可靠的编译环境。所以就出现了在x86上编译,在arm上运行的镜像,即交叉编译。在交叉编…

git 同时配置 gitee github

git 同时配置 gitee github 1、 删除C:\Users\dell\.ssh目录。 在任意目录右击——》Git Bash Here,打开Git Bash窗口,下方命令在Git Bash窗口输入。 2、添加git全局范围的用户名和邮箱 git config --global user.email "609612189qq.com" …

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

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

C10K问题:高并发模型设计

一、循环服务器模型 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> //*******// #include &l…

DeckGL MVTLayer+Mapbox注入shader实现简单效果

1.数据获取与处理 可以从OSM下载相应的带高度的矢量建筑物轮廓数据&#xff0c;下载后进行数据处理&#xff0c;保留高度字段&#xff0c;其他字段根据需求选择&#xff08;比如说想实现选中建筑物弹出相应建筑物的信息&#xff0c;就把这些信息字段保留下来&#xff09;&…