当前位置: 首页 > news >正文

慢sql优化和Explain解析

要想程序跑的快,sql优化不可懈怠!今日来总结一下常用的慢sql的分析和优化的方法。

1、慢sql的执行分析:

大家都知道分析一个sql语句执行效率的方法是用explain关键词:
举例:sql:select * from test where bussiness_date =‘2024-10-30’;
分析: explain select * from test where bussiness_date =‘2024-10-30’;
分析执行结果:
在这里插入图片描述
给business_date 加上一个索引,索引名称:test_bussiness_date_IDX
再执行分析:
在这里插入图片描述
对照着这两个分析结果下边来说下每一列都是什么意思

id:

在一个大的查询语句中,每个select关键字都对应一个id,代表多个表之间的查询顺序,或者包含子查询语句中的顺序,id顺序分为3中情况:
(1)id相同,执行顺序从上到下(因为小编举例都是单表,所以分析结果只有一行数据,如果sql中包括子查询或者多表联查,分析结果会有多行,感兴趣读者可以试试)
(2)id不同,如果是子查询,id值会递增,执行顺序是从大到小的。id越大优先级越高,越先被执行。
(3)id相同和不同的同时存在,此时id相同的为一组,id越大越优先执行,组内id相同,从上到下依次执行(比较复杂的sql会出现这种情况)。

select_type

select关键字对应的查询类型,示例中的 SIMPLE 表示简单子查询。不光这一种类型:具体类型解释如下:
(1)simple 简单子查询
(2)primary 最外层子查询
(3)subquery 第一层子查询,再select 或者where中包含了子查询。
(4)derived 派生表 再from中包含的子查询,会被标记为衍生查询,会把查询结果放到一个临时表中。
(5)union 出现在union后面的查询
(6)union result union联合查询获取结果的select,如果有两个select查询语句,他们之间用union连接起来查询,那么第二个select会被标记为union,union的结果被标记为union result。

table

表名,表示这一行的数据是那个表的,如果有别名,会显示别名。

partitions

访问的分区表信息。

type(优化重要信息字段)

针对单表的访问方法,一般来说保证查询至少达到range级别,最好达到ref。type其他类型详解:
性能从好–>差:依次是 system->const->eq_ref->ref->range->index->all.
如果出现index或者all就需要优化了,以下对每个值做详细的解释:
(1)system:表中只有一行记录,system是const的特例,几乎不会出现这种情况,可以忽略不计。
(2)const: 将主键索引或者唯一索引放到where条件中查询,mqsql可以将查询条件转变成一个常量,只匹配一行数据,索引依次就找到数据了。
(3)eq_ref: 同ref差不多,但返回结果只有一条记录。
(4)ref:不是主键索引,也不是唯一索引,就是普通的索引,可能会返回多个符合条件的行。
(5)range:只用一个索引来选择行,key列显示所用的索引名称。
(6)index:也是读取全表,但是是从索引中读取。
(7)all:全表查询,从磁盘中读取。效率最差。

possible_keys

可能用到的索引,查询中涉及字段上若存在索引,则会被列出来,表示可能用到的索引,但是并不是实际上一定会用到的索引。

key

实际用到的索引。

key_len

表示索引中使用的字节数。通过该属性可以知道在查询中使用的索引长度,这个长度是最大可能长度,并非实际使用长度,在不损失准确性的情况下,长度越短查询效率越高。

ref

关联id等信息。当使用索引列等值查询时,与索引列进行等值匹配的对象信息。

rows:

预估的需要读取的记录条数。根据表信息统计及索引的使用情况,大致估算找到所需记录需要读取的行数,row越小越好。

filtered

查到到所需记录占总扫描记录数的比例。

Extra(优化重要信息字段)

Extra:一些额外的信息。
当此字段中出现以下的两个值时,意味着mqSql根本不能使用索引,效率会收到重大影响,要尽可能的对此进行优化。
Using fileSort(使用文件排序) 和 Using temporary(使用临时表)
下面对每个值进行详细的解释:
(1)Using index:使用了覆盖索引,避免访问了表的数据行,效率不错。如果同时出现了Using where,表明索引被用来执行索引键值的查找;如果没有同时出现Using where表明索引用来读取数据而非执行查找动作。
索引覆盖有两种理解方式:(1)就是select的数据列,只用从索引中就能取得,不必读取数据行,Mqsql可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说也就是查询列要被所建的索引列覆盖。(2)索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行,毕竟索引叶子节点存储了他们索引的数据;当然通过读取索引就可以得到想要的数据,那就不需要读取行了,一个索引包含了满足查询结果的数据就叫做覆盖索引。
(2)Using index condition:用了条件索引(索引下推)
(3)Using where:从索引查出来数据后继续使用where条件过滤。
(4)Using join buffer(Block Nested Loop):join的时候利用了join buffer(优化方法:去掉外连接,增大join buffer的大小)
(5)Using fileSort(重点优化):用了文件排序,俗称“文件排序”,排序的时候没有用到索引,在数据量大的时候几乎是“九死一生”,在order by 或者group by过程中,order by的字段不是索引字段,或者select查询字段存在不是索引字段,或者select 查询字段都是索引字段,但是order by的字段顺序和select的索引字段的顺序不一致,都会导致fileSort。
(6)Using temporary(重点优化):用了临时表保存中间结果,常见于order by和group by中(优化方法:增加条件以减少结果集、怎讲索引,总之就是:要么减少待排序的数量,要么提前排好序)
(7)Start temporary,End temporary:子查询的时候,可以优化成半连接,但是使用的是通过临时表来去重。
(8)FirstMatch(tb1_name):子查询的时候,可以优化成半连接,但是使用的是直接进行数据比较来去重。
(9)impossible where:表示where子句的值总是false,不能用来获取任何元素。
(10)select tables optimized away 在没有group by 子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化Count(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
(11)distinct:优化distinct,在找到第一匹配的元组后即停止找同样值的工作。

2、常见的慢sql优化手段:

(1)select * 语句减少使用,会增加很多不必要的消耗(cpu,io,内存,网络带宽等)可以在select语句后指明具体的字段名称,增加了使用覆盖索引的可能性;
(2)排序时注意是否能用到索引,确保order by和group by涉及的列上有索引,尽量减少排序和分组操作的数据量。
(3)使用like模糊查询的时候,尽量使用最左匹配模式,即like ‘abc%’,这样可以使用索引。
(4)避免对where语句中字段使用函数或运算,会导致索引失效(高版本的mysql数据库,函数也可以使用索引)
(5) 在多条件查询的时候,最好创建联合索引,因为多个单列索引在多条件查询时,一般只会生效一个索引,mysql会选择其中一个限制最为严格的作为索引。
(6)对于联合索引,要遵守最左前缀法则(使用联合索引的一部分字段时需要考虑最左原则,否则会失效,如果使用全部字段就不需要考虑了,不会失效)
(7)使用合理的分页方式,以提高分页的效率。
(8)使用limit限制返回的行数,如只需要一条数据使用limit 1;
(9)对大表进行分区,可根据时间、范围、哈希等方式分区,查询时只扫描相关分区,减少不必要的数据扫描。
(10)避免使用临时表
(11)优化联合查询,在联合查询中尽量能使用UNION ALL。UNION会去除重复的记录,需要额外的排序和去重操作,性能较差。UNION ALL直接合并结果集,不进行去重,性能更好。如果业务逻辑允许,邮箱使用UNION。
(12)拆分大字段,将包含大字段(如:BLOB,TEXT)的表进行拆分,将大字段放在单独的表中,已减少主表的存储开销和查询压力。
(13)读写分离,将读操作和写操作分离,通过主从复制实现读写分离,减少主库压力,提高读写性能。
(14)根据业务需求,从业务逻辑入手,优化查询需求和频率,避免不必要的频繁查询。

相关文章:

慢sql优化和Explain解析

要想程序跑的快,sql优化不可懈怠!今日来总结一下常用的慢sql的分析和优化的方法。 1、慢sql的执行分析: 大家都知道分析一个sql语句执行效率的方法是用explain关键词: 举例:sql:select * from test where bussiness_…...

ALIGN_ Tuning Multi-mode Token-level Prompt Alignment across Modalities

文章汇总 当前的问题 目前的工作集中于单模提示发现,即一种模态只有一个提示,这可能不足以代表一个类[17]。这个问题在多模态提示学习中更为严重,因为视觉和文本概念及其对齐都需要推断。此外,仅用全局特征来表示图像和标记是不…...

【Java SE】代码注释

代码注释 注释(comment)是用于说明解释程序的文字,注释的作用在于提高代码的阅读性(可读性)。Java中的注释类型包括3种,分别是: 单行注释多行注释文档注释 ❤️ 单行注释 基本格式&#xff…...

如何在算家云搭建Llama3-Factory(智能对话)

一、Llama3-Factory 简介 当地时间 4 月 18 日,Meta 在官网上宣布公布了旗下最新大模型 Llama 3。目前,Llama 3 已经开放了 80 亿(8B)和 700 亿(70B)两个小参数版本,上下文窗口为 8k。Llama3 是…...

操作数据表

创建表 创建表语法: CREATE TABLE table_name ( field1 datatype [COMMENT 注释内容], field2 datatype [COMMENT 注释内容], field3 datatype ); 注意: 1. 蓝色字体为关键字 2. CREATE TABLE 是创建数据表的固定关键字,表…...

C# 实现进程间通信的几种方式(完善)

目录 引言 一、基本概念 二、常见的IPC方法 1. 管道(Pipes) 2. 共享内存(Shared Memory) 3. 消息队列(Message Queues) 4. 套接字(Sockets) 5. 信号量(Semaphore…...

MySQL Workbench Data Import Wizard:list index out of range

MySQL Workbench的Data Import Wizard功能是用python实现的,MySQL Workbench自带了一个python,数据导入的时候出现错误提示 22:55:51 [ERR][ pymforms]: Unhandled exception in Python code: Traceback (most recent call last): File "D…...

微信支付宝小程序SEO优化的四大策略

在竞争激烈的小程序市场中,高搜索排名意味着更多的曝光机会和潜在用户。SEO即搜索引擎优化,对于小程序而言,主要指的是在微信小程序商店中提高搜索排名,从而增加曝光度和用户访问量。有助于小程序脱颖而出,提升品牌知名…...

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion论文阅读笔记

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion 论文阅读笔记 这是ECCV2024的论文,作者单位是是港中文和上海AI Lab 文章提出了一个叫AutoDIR的方法,包括两个关键阶段,一个是BIQA,基于vision-language…...

SQLite 数据库设计最佳实践

SQLite特点 SQLite是一款功能强大的 轻量级嵌入式数据库 ,具有以下显著特点: 体积小 :最低配置仅需几百KB内存,适用于资源受限环境。 高性能 :访问速度快,运行效率高于许多开源数据库。 高度可移植 :兼容多种硬件和软件平台。 零配置 :无需复杂设置,开箱即用。 自给自…...

【论文精读】ID-like Prompt Learning for Few-Shot Out-of-Distribution Detection

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀论文精读_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 注:下文…...

Android 10.0 根据包名禁用某个app的home事件

1.前言 在10.0的系统rom定制化开发中,在某些app中,需要禁用home事件,在普通的app中又无法 禁用home事件,所以就需要从系统中来根据包名禁用home事件了,接下来分析下 系统中处理home事件的相关流程 2.根据包名禁用某个app的home事件的核心类 frameworks/base/services/c…...

Rust 文档生成与发布

目录 第三节 文档生成与发布 1. 使用 RustDoc 生成项目文档 1.1 RustDoc 的基本使用 1.2 文档注释的格式与实践 1.3 生成文档的其他选项 1.4 在 CI/CD 中生成文档 2. 发布到 crates.io 的步骤与注意事项 2.1 创建 crates.io 账户 2.2 配置 Cargo.toml 2.3 生成发布版…...

【C++动态规划】有效括号的嵌套深度

本文涉及知识点 C动态规划 LeetCode1111. 有效括号的嵌套深度 有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。 嵌套深度 depth 定义:即有效括号字符串嵌套的层…...

2024年优秀的天气预测API

准确、可操作的天气预报对于许多组织的成功至关重要。 事实上,在整个行业中,天气条件会直接影响日常运营,包括航运、按需、能源和供应链(仅举几例)。 以公用事业为例。根据麦肯锡的数据,在 1.4 年的时间里…...

Android和iOS有什么区别?

Android 和 iOS 有以下区别: 开发者与所属公司: Android:由谷歌公司开发以及开放手机联盟维护。它是基于 Linux 内核和其他开源软件的修改版本,代码开源程度较高,许多厂商都可以基于 Android 源代码进行深度定制和开发…...

NVR小程序接入平台/设备EasyNVR多个NVR同时管理多平台级联与上下级对接的高效应用

政务数据共享平台的建设正致力于消除“信息孤岛”现象,打破“数据烟囱”,实现国家、省、市及区县数据的全面对接与共享。省市平台的“级联对接”工作由多级平台共同构成,旨在满足跨部门、跨层级及跨省数据共享的需求,推动数据流通…...

Spring Cloud Sleuth(Micrometer Tracing +Zipkin)

分布式链路追踪 分布式链路追踪技术要解决的问题,分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节…...

人工智能:机遇与挑战

人工智能(AI)作为当今世界科技发展的前沿领域,正在以前所未有的速度和规模影响着我们的生活和工作方式。AI技术的应用前景广阔,从医疗健康到金融服务,从教育到交通,再到娱乐和家庭生活,AI正在逐…...

mac电脑设置crontab定时任务,以及遇到的问题解决办法

crontab常用命令 crontab -u user:用来设定某个用户的crontab服务; crontab file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入&#xf…...

Backtrader 数据篇 02

Backtrader 数据篇 本系列是使用Backtrader在量化领域的学习与实践,着重介绍Backtrader的使用。Backtrader 中几个核心组件: Cerebro:BackTrader的基石,所有的操作都是基于Cerebro的。Feed:将运行策略所需的基础数据…...

视频转场素材资源网站分享

视频剪辑者常常为找不到合适的转场素材而苦恼。合适的转场素材能让视频更流畅,给观众带来惊喜。下面就为大家介绍几个宝藏网站,提供丰富的转场剪辑素材,让你的视频瞬间高大上。 蛙学网 首先重磅推荐蛙学网,堪称视频素材界的“翘楚…...

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制(Replication)1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念:复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…...

基于OSS搭建在线教育视频课程分享网站

OSS对象存储服务是海量、安全、低成本、高持久的存储服务。适合于存储大规模非结构化数据,如图片、视频、备份文件和容器/虚拟机镜像等。 安装nginx wget https://nginx.org/download/nginx-1.20.2.tar.gz yum -y install zlib zlib-devel gcc-c pcre-devel open…...

CentOS 7 下升级 OpenSSL

升级openssh,下载:https://download.csdn.net/download/weimeilayer/89935114 上传到服务器,然后执行命令 rpm -Uvh *.rpm --nodeps --force安装依赖 yum -y install gcc perl make zlib-devel perl-CPAN下载安装包:https://github.com/ope…...

线上 Dump

优质博文:IT-BLOG-CN 一、简介 机器宕机或者请求很慢最常出现的几种问题:针对代码bug或者qps过高造成的。 【1】cpu过高致内存耗尽OOM,堆区对象回收不及时cpu被打满 【2】死锁抢用资源导致cpu过高致耗尽 【3】内存泄漏: 堆内存由…...

AcWing 1303:斐波那契前 n 项和 ← 矩阵快速幂加速递推

【题目来源】https://www.acwing.com/problem/content/1305/http://poj.org/problem?id3070【题目描述】 大家都知道 数列吧,。现在问题很简单,输入 和 ,求 的前 项和 。【输入格式】 共一行,包含两个整数 和 。【输出格式】…...

2024 Rust现代实用教程:1.2编译器与包管理工具以及开发环境搭建

文章目录 一、Rust的编译器rustc二、开发环境搭建三、Rust的包管理工具Cargo四、项目结构1.Cargo.toml文件2.创建一个可执行文件项目3.创建一个库项目 参考 一、Rust的编译器rustc 查看版本 rustc-version编译生成二进制文件 rustc -o output filename filename.rs编译生成库…...

人工智能原理实验一:知识的表示与推理实验

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程,通过实验,帮助学生更好地掌握人工智能相关概念、技术、原理、应用等;通过实验提高学生编写实验报告、总结实验结果的能力;使学生对智能程序、智能算法等有…...

自学C语言——VS实用调试技巧总结

接上一篇:自学C语言——扫雷游戏(无递归) 什么是bug “bug”本意是昆虫或虫子,一般指电脑系统或程序中,隐藏着一些未被发现的缺陷或者问题,简称程序漏洞。 第一代的计算机是由许多庞大且昂贵的真空管组成&…...

杭州做网站优化/引擎优化是什么意思

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花布条和小饰…...

贵阳市观山湖区建设局网站/社区推广方法有哪些

JavaScript的组成JavaScript语法DOM:页面文档对象模型,对页面中的元素进行操作(DOM API是浏览器给js提供的操作页面元素的api)BOM:浏览器对象模型,对浏览器窗口进行操作(BOM 是浏览器提供给js 的另一组操作浏览器的api…...

龙岩一中网站/seo培训学什么

概述 NTP是从时间协议(time protocol)和ICMP时间戳报文(ICMP TimeStamp Message)演变而来,在准确性和健壮性方面进行了特殊的设计,理论上精确可达十亿分之一秒。 NTP协议应用于分布式时间服务器和客户端之间…...

手机网站关闭窗口代码/排名优化seo公司

首先说一下什么是依赖循环,比如:我现在有一个ServiceA需要调用ServiceB的方法,那么ServiceA就依赖于ServiceB,那在ServiceB中再调用ServiceA的方法,就形成了循环依赖。Spring在初始化bean的时候就不知道先初始化哪个be…...

电子商务网站开发基础/直通车怎么开

卷积(convolution) --------------------------------------------------手动分割线---------------------------------------------- 赫斯特指数(Hurst exponent) (1)理解其在统计学上的意义 (2)理解求…...

邢台路桥建设总公司网站/刷赞业务推广网站

一、前言 1、[].slice.call(lis)将伪数组转化为真数组 2、node.nodeType: 得到节点类型 3、Object.defineProperty(obj, propName, {}): 给对象添加修改属性 4、Object.keys(obj) 5、DocumentFragment: 文档碎片…...