首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL EXPLAIN执行计划详解

当执行查询时,这个标记会使其返回关于在执行计划中每一步的信息,而不是真正完全的执行该语句。 它会返回一行或多行信息,显示出执行计划中的每一部分和执行的次序。...第一个SELECT被标记就好像它以部分外查询来执行,因此第一个SELECT可能显示为PRIMARY。如果UNION被FROM字句中的子查询包含,那么它的第一个SELECT被标记为DERIVED。...index:跟全表扫描一样,只是MySQL扫描表时按照索引次序进行而不是行,主要优点是避免了排序;缺点是要承担按索引次序读取整个表的开销。这通常意味着如实按照随机次序访问行,开销较大。...这个参考值或者是一个常数,或者来自多表查询前一个表里的结果值。 eq_ref:使用这种索引查找,MySQL清楚的知道最多只返回一条符合条件的记录,使用主键或者唯一值索引查找时能看到这种方法。...常见的重要值如下: Using index:表示MySQL将使用覆盖索引,这发生在对表的请求列都是同一索引的部分的时候,返回的列数据只使用了索引中的信息,而没有再去访问表中的行记录。是性能高的表现。

1.7K140

Mysql的SQL优化指北

不论是叶子节点中的记录,还是内节点中的记录(也就是不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单向链表。...而增、删、改操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行一些记录移位,页面分裂、页面回收啥的操作来维护好节点和记录的排序。...来说,可以用name快速定位到通过条件name > 'Asa' AND name '1980-01-01'条件继续过滤,因为通过name进行范围查找的记录中可能并不是按照...减少对行锁的时间 两阶段锁协议: 在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。...也就是前面的第一条原则,server层要什么字段,InnoDB就返回什么字段。 但是count()是例外,并不会把全部字段取出来,而是专门做了优化,不取值。count()肯定不是null,按行累加。

98320
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    简单了解SQL性能优化工具MySql Explain

    输出信息 explain对select语句操作返回一行输出信息,表示的顺序是mysql处理语句时实际读取表的顺序。 mysql通过嵌套循环方式解决所有join操作。...就是说mysql从第一个表中读取一行,在第二个表中找到匹配的一行,之后在找到第三个表,以此类推。 explain输出列包含如下信息: id 执行编号,标识select所属的行。...key_len 显示mysql在索引里使用的字节数 ref 显示了之前的表在key列记录的索引中查找值所用的列或常量 rows 为了找到所需的行而需要读取的行数,估算值,不精确。...All:最坏的情况,全表扫描 index:和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。...eq_ref:最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效) const:当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。

    1.5K20

    MySQL Explain查看执行计划

    UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询) UNION RESULT(UNION的结果) SUBQUERY(子查询中的第一个SELECT) DEPENDENT SUBQUERY...(子查询中的第一个SELECT,取决于外面的查询) DERIVED(派生表的SELECT, FROM子句的子查询) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行...七、key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的...十、Extra 该列包含MySQL解决查询的详细信息,有以下几种情况: Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候...Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行 总结: • EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

    1.9K30

    MySQL EXPLAIN详解

    EXPLAIN Output Columns 列名 说明 id 执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。...key_len 显示mysql在索引里使用的字节数 ref 显示了之前的表在key列记录的索引中查找值所用的列或常量 rows 为了找到所需的行而需要读取的行数,估算值,不精确。...union 顾名思义,首先需要满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询 subquery 子查询中第一个SELECT语句 dependent subquery...类型 说明 All 最坏的情况,全表扫描 index 和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。...eq_ref 最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效) const 当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。

    1.3K90

    Explain详解与索引优化实践

    在你的SQL查询语句前加上 explain 即可,如explain select * from table,MySQL会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果...(4)type列 (温馨提示:以下部分理论有可能解释完还是懵逼,没关系,继续往下看,有实践例子) 这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据记录的大概范围。...而第一个select复杂查询的表只有一条记录,所以结果也肯定只有一条记录(第二个select子查询之前表中可能是多条记录),这种特例它的type为system类型,性能最高。...(index是从索引中读取的,而ALL是从硬盘中读取) 执行SQL语句:EXPLAIN SELECT * FROM film;(film表所有字段都加了索引) ALL: 即全表扫描,意味着MySQL需要从头到尾去查找所需要的行...执行SQL语句:EXPLAIN SELECT DISTINCT NAME FROM film Using filesort:MySQL会对结果使用一个外部索引排序,而不是按照索引次序从表里读取行。

    64920

    MySQL索引原理、失效情况

    1.3 唯一索引vs普通索引 从查询上来说 对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录。...对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。...ref: 这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。...这个类型严重依赖于根据索引匹配的记录多少—越少越好。 range: 这个连接类型使用索引返回一个范围中的行,比如使用>或查找东西时发生的情况。...3)多表join的关联列 4、通过索引扫描的行记录数超过全表的10%~30%左右,优化器不会走索引,而变成全表扫描 5、避免使用双%号的查询条件。

    1.2K11

    MySQL Explain详解

    ) (6) SUBQUERY(子查询中的第一个SELECT) (7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询) (8) DERIVED(派生表的SELECT..., FROM子句的子查询) (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) 三、table 显示这一行的数据是关于哪张表的,有时不是真实的表名字...七、key_len *表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的...)* 不损失精确性的情况下,长度越短越好 八、ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 九、rows 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数...十、Extra 该列包含MySQL解决查询的详细信息,有以下几种情况: Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

    1.1K10

    mysql学习笔记(一)sql语句执行

    · 查询缓存的缺点 这里使用查询缓存并不是最优的,因为如果需要使用缓存,我们一般会考虑这个缓存的命中率,而一般来说mysql的查询命中率是非常低的,除非这张表中存的是一些静态的配置数据,很长时间才会更新一次...从分析器开始真正的进入sql语句执行的第一步,解析sql语句。...如果没有命中索引: 首先会调用innoDB引擎接口取这个表的第一行数据判断是否满足条件, 如果不是则跳过,如果是则将这行结果存储在结果集中。...如果命中缓存: 大致过程相似,调用innoDB引擎接口取第一行数据会从索引叶的第一行 数据开始取数据判断,第二行会从索引叶的第二行数据判断。...而binlog是逻辑日志,记录的是这个语句的原始逻辑,比如给id=1这一行的score字段加100。 有了binlog也可以保证我们快速恢复近期某一时刻的数据。

    2.1K20

    面试前必须知道的MySQL命令【expalin】

    中的第二个或者随后的查询,其次取决于外面的查询 UNION RESULT:UNION 的结果 SUBQUERY:子查询中的第一个select语句(该子查询不在from子句中) DEPENDENT SUBQUERY...:子查询中的 第一个 select,同时取决于外面的查询 DERIVED:包含在from子句中子查询(也称为派生表) UNCACHEABLE SUBQUERY:满足是子查询中的第一个 select 语句...ref:一种索引访问,也称索引查找,它返回所有匹配某个单个值的行。此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了最左前缀规则索引的查询。...eq_ref:使用这种索引查找,最多只返回一条符合条件的记录。在使用唯一性索引或主键查找时会出现该值,非常高效。...Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,一般有出现该值,都建议优化去掉,因为这样的查询 CPU 资源消耗大。

    1K20

    分析查询语句EXPLAIN详解,一步一步带你了解字段的含义

    ,执行查询会返回执行计划的信息,而不是执行这条 SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 官网:https://dev.mysql.com/doc/refman/...,可以在具体的查询语句前边加一个 EXPLAIN ,就像这样:在 select 语句之前增加 explain 关键字,它会返回一行或多行信息,显示出执行计划中的每一部分和执行的顺序。...4、type列 这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。...例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表 为空的情况: 选取最小值或最大值值 查询中where语句永远不会为真 从字面上返回值的查询 explain select min...通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。

    67610

    EXPLAIN 使用分析

    select SUBQUERY 子查询中的第一个SELECT,结果不依赖于外部查询 DEPENDENT SUBQUERY 子查询中的第一个SELECT,依赖于外部查询 DERIVED 派生表的SELECT...ref: 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,可能会找多个符合条件的行,属于查找和扫描的混合体。...该字段显示为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。...ref 列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 rows 根据表统计信息以及索引选用情况,大致估算出找到所需的记录所需要读取的行数 Extra 包含不适合在其他列中显示...而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成排序操作称为“文件排序” Using temporary 使用了临时表保存中间结果,mysql在查询结果排序时使用临时表。

    1K20

    Mysql Explain 详解

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引...的结果) (6) SUBQUERY(子查询中的第一个SELECT) (7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询) (8) DERIVED(派生表的SELECT..., FROM子句的子查询) (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) 三、table 显示这一行的数据是关于哪张表的,有时不是真实的表名字...七、key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的...十、Extra 该列包含MySQL解决查询的详细信息,有以下几种情况: Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

    1.1K20

    没内鬼,来点干货!SQL优化和诊断

    如果在语句中没有子查询或关联查询,只有唯一的select,每行都将显示1.否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置 select_type 显示本行是简单或复杂select...ref 显示了之前的表在key列记录的索引中查找值所用的列或常量 rows 为了找到所需要的行而需要读取的行数...在阿里出品的Java编程规范中写道: 利用延迟关联或者子查询优化超多分页场景 说明:MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回 N 行...来判断是否为 NULL 值 说明:NULL 与任何值的直接比较都为 NULL # 1) NULLNULL 的返回结果是 NULL,而不是 false。...# 2) NULL=NULL 的返回结果是 NULL,而不是 true。 # 3) NULL1 的返回结果是 NULL,而不是 true。

    69140

    Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化

    explain关键字 explain关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。...SUBQUERY 子查询中的第一个select查询,不依赖于外部查询的结果集。 DEPENDENT SUBQUERY 子查询中的第一个select查询,依赖于外部查询的结果集。...ref 连接不能基于关键字选择单个行,可能查找到多个符合条件的行。叫做ref是因为索引要跟某个参考值相比较。...index 全表扫描,只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序,但是开销仍然非常大。 all 最坏的情况,从头到尾全表扫描。...rows为416,并没有因为使用了limit关键字而返回较小的值,因此两条sql都需要做一下简单的优化。 几张表都没有创建索引,是不是就没有索引了呢?

    1.3K110

    explain的属性详解与提速百倍的优化示例

    union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union。...const:查找主键索引,返回的数据至多一条(0或者1条)。属于精确查找。 eq_ref:查找唯一性索引,返回的数据至多一条。属于精确查找。 ref:查找非唯一性索引,返回匹配某一条件的多条数据。...using where:表示存储引擎返回的记录并不是所有的都满足查询条件,需要在server层进行过滤。...这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。...表,我们完全可以拆成两部分,并用union连接起来,注意这里用union,而不用union all是因为原语句有“distinct”来得到唯一的记录,而union恰好具备了这种功能。

    1.3K30

    explain 分析sql语句字段的解释

    range:只检索给定范围的行,使用索引来匹配行。范围缩小了,当然比全表扫描和全索引文件扫描要快。sql语句中一般会有between,in,>,返回所有匹配某个单独值的行。比如查询公司所有属于研发团队的同事,匹配的结果是多个并非唯一值。...key_len 显示的值为索引字段的最可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。 ref 显示索引的哪一列或常量被用于查找索引列上的值。...extra Using filesort: 说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序” 。...覆盖索引(Covering Index) :也叫索引覆盖,就是select 的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select 列表中的字段,而不必根据索引再次读取数据文件

    3.2K51
    领券