慢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种,分别是: 单行注释多行注释文档注释 ❤️ 单行注释 基本格式ÿ…...

如何在算家云搭建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命令将接受标准输入…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...