MySQL:QEP 查询执行计划

QEP

QEP 是指查询执行计划(Query Execution Plan),它是由数据库系统在执行查询时生成的一组操作指令。这些指令定义了查询的具体执行方式,包括涉及哪些表、使用哪些索引、以及哪些算法、操作符等。

查询执行计划是数据库查询优化过程中的重要概念,它涉及到查询的性能和效率。通过分析并优化查询执行计划,我们可以使查询更加高效和快速地运行,并避免不必要的查询开销和资源浪费。

在数据库系统中,当用户提交一个查询时,系统会根据查询的语句和条件生成一个查询执行计划,这个计划是被叫做优化器生成的。通过优化查询执行计划,系统可以选择最优的执行路径,使得查询能够快速有效的运行。

优化器可能根据不同的算法和策略生成多个不同的查询执行计划,这些计划可能会对查询的性能产生不同的影响。DBMS 会使用成本估算函数来比较不同执行计划的成本,然后选择成本最小的执行计划来执行查询。

通常我们也可以使用数据库性能分析工具来查看查询执行计划,以帮助识别查询性能问题并确定可优化的领域。

查询示例

SELECT 语句前加上 EXPLAIN,可查询 SQL 的查询执行计划

也可以使用 SQL 工具查看,如:Navicat 中的“解释”选项即可查看

执行如下语句:

EXPLAIN SELECT * FROM book WHERE price < 30;

查询结果:

![[EXPLAIN SELECT.png]]

  • id:SELECT 识别符。这是 SELECT 的查询序列号。

  • select_type:SELECT 类型:

    • SIMPLE: 简单 SELECT (不使用 UNION 或子查询)

    • PRIMARY: 最外层的 SELECT

    • UNION:UNION 中的第二个或后面的 SELECT 语句

    • DEPENDENT UNION:UNION 中的第二个或后面的 SELECT 语句,取决于外面的查询

    • UNION RESULT:UNION 的结果

    • SUBQUERY:子查询中的第一个 SELECT

    • DEPENDENT SUBQUERY:子查询中的第一个 SELECT,取决于外层的查询

    • DERIVED:导出表的 SELECT (FROM 子句的子查询)

  • table:表名

type:联接类型。是SQL性能的非常重要的一个指标,结果值从好到坏依次是:

  • system:表仅有一行(=系统表)。这是 const 联接类型的一个特例。

  • const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。用于用常数值比较 PRIMARY KEY 或 UNIQUE 索引的所有部分时。

  • eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了 const 类型。它用在一个索引的所有部分被联接使用并且索引是 UNIQUE 或 PRIMARY KEY。

    eq_ref 可以用于使用 = 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。

  • ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是 UNIQUE 或 PRIMARY KEY (如果联接不能基于关键字选择单个行的话),则使用 ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。ref 可以用于使用=或<=>操作符的带索引的列。

  • fulltext

  • ref_or_null:该联接类型如同 ref,但是添加了MySQL可以专门搜索包含 NULL 值的行。在解决子查询中经常使用该联接类型的优化。

  • index_merge:该联接类型表示使用了索引合并优化方法。在这种情况下,key 列包含了使用的索引的清单,key_len 包含了使用的索引的最长的关键元素。

  • unique_subquery:是一个索引查找函数,可以完全替换子查询,效率更高。该类型替换了下面形式的 IN 子查询的 ref:```

value IN (SELECT primary_key FROM single_table WHERE some_expr)
  • index_subquery:该联接类型类似于 unique_subquery。可以替换 IN 子查询,但只适合下列形式的子查询中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
  • range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len 包含所使用索引的最长关键元素。在该类型中 ref 列为 NULL。当使用 =、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range

  • index:该联接类型与 ALL 相同,除了只有索引树被扫描。这通常比 ALL 快,因为索引文件通常比数据文件小。

  • ALL:对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记 const 的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用 ALL,使得行能基于前面的表中的常数值或列值被检索出。

一般来说,需要保证查询至少达到 range 级别。

  • possible_keys:possible_keys 列指出 MySQL 能使用哪个索引在该表中找到行(SQL语句中涉及到的索引)。该列完全独立于 EXPLAIN 输出所示的表的次序。这意味着在 possible_keys 中的某些键实际上不能按生成的表次序使用。

  • key:key 列显示 MySQL 实际决定使用的键(索引)。如果没有选择索引,键是 NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

  • key_len:key_len 列显示 MySQL 决定使用的键长度。如果键是NULL,则长度为 NULL。注意通过 key_len 值我们可以确定MySQL将实际使用一个多部关键字的几个部分。

  • ref:ref 列显示使用哪个列或常数与 key 一起从表中选择行。

  • rows:rows 列显示 MySQL 认为它执行查询时必须检查的行数。

  • Extra:该列包含 MySQL 解决查询的详细信息。

    • Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。

    • Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。

    • range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。对前面的表的每个行组合,MySQL检查是否可以使用range或index_merge访问方法来索取行。

    • Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行。

    • Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。当查询只使用作为单一索引一部分的列时,可以使用该策略。

    • Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。

    • Using where:WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALL或index,查询可能会有一些错误。

    • Using sort_union(…), Using union(…), Using intersect(…):这些函数说明如何为index_merge联接类型合并索引扫描。

    • Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。

优化建议

通过分析 EXPLAIN 命令的输出结果,我们可以发现查询中的性能瓶颈,并采取相应的优化措施。以下是一些常见的优化建议:

  1. 优化索引:确保查询中涉及的列都建立了合适的索引。如果可能,使用覆盖索引(Covering Index)来避免访问表的数据行。

  2. 减少数据扫描范围:通过调整查询条件或索引策略,减少MySQL需要扫描的数据量。

  3. 避免全表扫描:尽量避免使用type为ALL的查询,因为这会导致MySQL扫描整个表以查找匹配的行。

  4. 优化JOIN操作:对于包含JOIN操作的查询,确保JOIN条件上的列都建立了索引,并考虑使用更高效的JOIN类型(如eq_ref、ref)。

  5. 调整查询逻辑:有时,通过调整查询的逻辑顺序或重写查询语句,可以显著提高查询性能。

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

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

相关文章

IT运维管理与ITSM:理论与实践

IT运维管理和IT服务管理&#xff08;ITSM&#xff09;在现代企业信息化过程中占据着举足轻重的地位。它们不仅是确保IT系统稳定运行和业务连续性的关键&#xff0c;还是推动企业数字化转型、提升竞争力的重要力量。本文将结合《IT运维管理和ITSM》文档的内容&#xff0c;深入探…

搭建日志系统ELK(二)

搭建日志系统ELK(二) 架构设计 在搭建以ELK为核心的日志系统时&#xff0c;Logstash作为日志采集的核心组件&#xff0c;负责将各个服务的日志数据采集、清洗、过滤。然而缺点也很明显&#xff1a; 占用较多的服务器资源。配置复杂&#xff0c;学习曲线陡峭。处理大数据量时…

FPGA开发——呼吸灯的另一种实现方式

一、概述 关于呼吸灯的设计其实在前面的文章中就已经提到过&#xff0c;这篇文章更多的针对前面的实现方式进行一个改良。在前面的呼吸灯的设计使用的是us、ms、s的三级计数器进行功能实现&#xff0c;这种实现方法应该是我们最后理解也是最常用的方式。但经过蜂鸣器的音乐播放…

2024第18届中国西部体育博览会诚邀代理招展

2024第18届中国西部体育博览会诚邀代理招展 2024第18届中国西部体育博览会诚邀全国各关联商会、协会&#xff0c;联盟、各专业会展公司、各关联产业园区、各关联网站报纸杂志及平台等资源方组团参展&#xff0c;组委会将给予最优惠的代理招展政策&#xff0c;群策群力共同把中…

2024年音频剪辑必备:五大最佳音频编辑软件精选!

在数字时代&#xff0c;音频剪辑已成为创意表达的重要工具。无论是音乐制作、播客编辑还是视频后期&#xff0c;一款优秀的音频剪辑软件都是不可或缺的。推荐五款备受推崇的音频剪辑工具。 福昕音频剪辑 链接&#xff1a;https://www.foxitsoftware.cn/audio-clip/ 福昕音频…

关于DynamoRIO处理多线程程序时候的问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Java数据结构(五)——栈和队列

文章目录 栈和队列栈基本概念栈的模拟实现集合框架中的栈栈的创建栈的方法栈的遍历 栈的应用及相关练习括号匹配逆波兰表达式求值出栈入栈次序匹配最小栈 几个含"栈"概念的区分 队列基本概念队列的模拟实现循环队列双端队列集合框架中的队列队列的创建队列的方法队列…

数据结构(邓俊辉)学习笔记】词典 01—— 散列

文章目录 1. 从服务到电话2. 循值访问3. 数组4. 原理5. 散列6. 冲突 1. 从服务到电话 现在进入新的一章词典。将学习实现词典 adt 的重要技术&#xff0c;也就是散列。我们将看到散列实际上并不是一种简单的技术&#xff0c;从某种意义上讲&#xff0c;它甚至是一种思想&#x…

记录一次环境的安装

目录 新添加的代码 代码解释 为啥ubuntu用debian软件源 为啥修改sources.list.d S权限意思 php缺少和数据库连接的模块 使用root登陆数据库1698错误 字段解释 auth_socket解释 使用root登陆数据库方法 详细解释 首先在安装的时候&#xff0c;有一个dockerfile文件&a…

day 18流的定位、文件IO以及Linux系统中时间的获取

流的定位 偏移量&#xff1a;读和写都在偏移量的位置进行 文件IO 相对于标准IO来说&#xff0c;文件IO直接在Linux的内核中操作&#xff0c;也更加的简洁精炼 对文件的操作也是三个部分 1.打开文件 open 2.读写文件 read write 3.关闭文件 close 还有一些其他的函数接口…

vue3 命令运行窗口暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址&#xff0c;再加上--port --8080 就可以将端口号修改为8080&#xff08;修改后边的数字就可以修改为你想要的端口号&#xff09;

linux安装配置jdk

①下载jdk安装包&#xff0c;放在/opt/app/software/java下 cd /opt/app/software/java②进行解压操作 tar -zxvf jdk-8u251-linux-x64.tar.gz③解压完成之后&#xff0c;进行环境变量的配置&#xff0c;shell下执行 vi ~/.bash_profile根据jdk的安装目录&#xff0c;加入 …

【C++】学习笔记——智能指针

文章目录 二十一、智能指针1. 内存泄漏2. 智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器 未完待续 二十一、智能指针 1. 内存泄漏 在上一章的异常中&#xff0c;我们了解到如果出现了异常&#xff0c;会中断执行流…

LocalDateTime计算两个时间之间的间隔

LocalDateTime计算两个时间之间的间隔 嘚吧嘚LocalDateTimeLocalDateLocalTime 嘚吧嘚 自从认识了LocalDateTime之后&#xff0c;使用的频率越来越高了&#xff0c;使用多了就不可避免的涉及到日期的比较、加减以及计算日期间隔这些操作。 但是我发现自己好像不会&#x1f605…

2024年钉钉杯大学生大数据挑战赛倒计时,最后冲刺

2024第三届钉钉杯大学生大数据挑战赛倒计时&#xff0c;小编给大家带来非常实用的最后冲刺助力【A题】&#xff0c;&#xff08;看图资料预览&#xff09;&#xff1a; 中国烟草行业作为国家税收和财政收入的重要支柱&#xff0c;近年来销售收入持续增长。国家对此实行严格的专…

一键测量仪,能否彻底解决燃气灶配件缺陷问题?

燃气灶配件是指用于燃气灶的附件或零部件&#xff0c;用于安装、维护或改进燃气灶的功能和性能。这些配件通常包括各种零部件、附件和替换件&#xff0c;以确保燃气灶的正常运行和安全使用。燃气灶的火焰头是产生火焰的部件&#xff0c;通常根据不同的燃气类型和火力需求选择合…

ETL数据集成丨快速将MySQL数据迁移至Doris数据库

随着大数据技术的迅速发展&#xff0c;越来越多的企业开始寻求高效、灵活的数据存储与分析解决方案。Apache Doris&#xff08;原名 Palo&#xff09;作为一款高性能的MPP&#xff08;大规模并行处理&#xff09;分析型数据库&#xff0c;凭借其在OLAP场景下的卓越表现&#xf…

Minio多主机分布式 docker-compose 集群部署

参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) 【运维】docker-compose安装minio集群-CSDN博客 Minio 是个基于 Golang 编写的开源对象存储套件&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能 中文地址&#xff1a;MinIO | 用于AI的S3 …

SYD88xx代码复位不成功和解决办法

原来的复位代码如下: void ota_manage(void){#ifdef _OTA_if(ota_state){switch(ota_state){case 1 : #if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)dbg_printf("start FwErase\r\n");#endifCmdFwErase();#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)db…

Spring Boot 动态数据源

目录 前言 前置环境 pom yml Entity Dao 枚举类 数据源 AOP Controller 启动类 演示 前言 大多数系统中&#xff0c;都需要数据库来持久化数据&#xff0c;在大多数情况下&#xff0c;一个系统只需要配置一个数据源便能够完成所有业务的查询&#xff0c;保存操作。…