output 列名 备注 id select的编号,从1开始,如果是没有子查询,则编号为1,如果有子查询,则最外侧的select为1,然后按照select的顺序从左到右逐渐递增 select_type...查询类型,例如简单查询,子查询,Union查询等(具体见下表) table select所访问的表(也可以是派生表) partitions 用于分区表, 表示select所访问的表的分区 type 表示该...possible_keys 表示可能会用到的索引用来加速查询,未经过优化器确定。 key 经过优化器确定之后,实际采用的索引 key_len 实际采用的索引的字段长度....(计算方式与字符集、字段类型是否为固定长度以及是否可以为null有关系) ref 表示key在查找数据的时候,所用到的常量或者列名 rows 查询所扫描的行数,但是一般不准确。...ref可以用于使用=或操作符的带索引的列.或者仅查询主键,并且condition里面使用索引。
MySQL里的explain命令内容还是很丰富的,值得好好的挖掘出不少东西来。...本身来说explain就是生成执行计划的内容,如果细看,这个内容和Oracle explain plan for的结果相比还是有差距的。...首先是一个比较实际的用法,查询语句我们可以查看执行计划,如果是DML语句呢,他是直接变更了还是只是生成执行计划而已,明白这一点很重要。...explain 生成DML的执行计划 为了进一步的验证,我们选择3个版本,5.5,5.6,5.7来测试。 首先是初始化数据,这个在不同版本是一模一样的方式。 创建一个表test,插入两行数据。...for connection的新特性 如果对于explain开始有了一些感觉,那么我们再来看一个5.7中的新特性,那就是对connection的解析,也就是explain for connection
之前是一直没有听过explain这个关键字的, 最近因为项目中总是会有慢查询的一些操作, 所以请教了旁边的同事帮忙排查下原因, 看到同事用explain来分析一些sql语句, 感觉好像发现了新大陆一样。...然后使用explain进行各种查询: ?...通常全表扫描的代价是比较大的,建议创建适当的索引,通过索引检索避免全表扫描。...此外,全索引扫描(full index scan)的代价有时候是比全表扫描还要高的,除非是基于InnoDB表的主键索引扫描。...GROUP BY的列没有索引,或者GROUP BY和ORDER BY的列不一样,也需要创建临时表,建议添加适当的索引。
转自:http://blog.chinaunix.net/uid-540802-id-3419311.html explain显示了mysql如何使用索引来处理select语句以及连接表。...使用方法,在select语句前加上explain就可以了: 如: explain select surname,first_name form a,b where a.id=b.id EXPLAIN列的解释...(比ALL更好,因为索引一般小于表数据) ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免 先看一个例子: mysql> explain select * from...mysql> explain select * from t_order where order_id=100 union select * from t_order where order_id=200...mysql> explain select * from t_order where order_id=(select order_id from t_order where order_id=100)
重点是第二种用法,需要深入的了解。...先看一个例子: mysql> explain select * from t_order; +----+-------------+---------+------+---------------+-...---------+------+---------+------+--------+-------+ 1 row in set (0.03 sec) 加上extended后之后: mysql> explain...mysql> explain select * from t_order where order_id=100 union select * from t_order where order_id=200...mysql> explain select * from t_order where order_id=(select order_id from t_order where order_id=100)
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。...使用方法,在select语句前加上explain就可以了: 先看个例子 mysql> explain select * from t_order; | id | select_type | table...:子查询中的第一个SELECT DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询 DERIVED:导出表的SELECT(FROM子句的子查询) table 输出的行所引用的表...多行之间的数据相乘可以估算要处理的行数。 filtered 显示了通过条件过滤出的行数的百分比估计值。...rows 显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。 filtered 显示了通过条件过滤出的行数的百分比估计值。
执行EXPLAIN不会修改执行语句涉及的数据,也不会返回执行语句的结果集。...当用户执行一个复杂的查询时,EXPLAIN可以输出多行信息,每一行使用一个id进行唯一标识。...如果“SELECT”语句中包含UNION或子查询中包含“SELECT”语句,EXPLAIN的输出将包含两行,每行有一个单独的id。...如果在一个“SELECT”语句中JOIN两张表,EXPLAIN的输出将包含两行,两行将使用相同的id。...除了提供执行计划,在8.0.18之后的版本还提供了EXPLAIN ANALYZE功能。
什么是EXPLAIN?EXPLAIN 是 MySQL 中的一个重要命令,它用于分析 SQL 查询语句的执行计划。...EXPLAIN 的主要作用是帮助开发者理解查询语句的执行过程,以及查询优化器如何选择索引、表扫描方式等。通过分析 EXPLAIN 的输出结果,开发者可以找到查询性能的瓶颈,并对查询语句进行优化。...通过观察 EXPLAIN 的输出结果,你可以找出查询性能的瓶颈,如全表扫描、没有使用索引等。然后,你可以根据这些信息对查询语句进行优化,如添加合适的索引、调整查询条件等。为什么要使用EXPLAIN?...使用 EXPLAIN 的主要目的是分析和优化查询语句的执行计划。以下是一些使用 EXPLAIN 的重要原因:查询性能分析: 通过 EXPLAIN,你可以深入了解 MySQL 是如何执行查询的。...连接类型分析: 对于涉及多个表的查询,EXPLAIN 显示了连接类型(如嵌套循环连接、哈希连接等)。这有助于了解查询的复杂性和连接操作的开销。
这是SELECT的查询序列号。 select_type 1.SIMPLE:简单的SELECT,不实用UNION或者子查询。 2.PRIMARY:最外层SELECT。 3. ...4.DEPENDENT UNION:UNION语句中的第二个SELECT,依赖于外部子查询。 5.UNION RESULT:UNION的结果。...6.SUBQUERY:子查询中的第一个SELECT。 7.DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询。 8. ...DERIVED:导出表的SELECT(FROM子句的子查询) table 显示该语句涉及的表 type system > const > eq_ref > ref > fulltext > ref_or_null...rows 显示MySQL认为它执行查询时必须检查的行数 Extra 包含MySQL解决查询的详细信息。
人们很少做他们相信是对的事,他们做比较方便的事,然后后悔。...——鲍勃.迪伦 使用explain+SQL 作用: 表的读取顺序 数据读取操作的操作类型 哪些索引可以使用 哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询 id select_type...字句或操作表的顺序 id值越大执行优先级越高,id相同情况下执行顺序从上到下 select_type:查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询 simple简单的select查询...>ref>range>index>ALL system系统表 const通过索引一次就找到了,例如主键查询 explain select * from user where id = "" eq_ref...连表唯一条件 selec * from user,user_info where user.id = user_info.id ref返回匹配某个单独值的所有行 explain SELECT * FROM
我们在实际业务中经常会使用到explain,因为这里涉及到查询,下面我们来看一个例子,比如我们要查一本书的上一章或者下一章,我们的sql是这样: 查询5164这本书4054495这一章的上一章:下面的是...500多万条数据,我explain了一下: explain SELECT * FROM article WHERE (id explain一下结果,如下: explain SELECT * FROM article force index(idx_1) WHERE (id explain的解析结果,常用字段的说明: 字段:select_type 解释:select语句的类型 常见值及其说明: simple:表示简单的select,没有union和子查询 primary...小的表)进行连接的行的数目。
EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。...possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句 key: 实际使用的索引。如果为NULL,则没有使用索引。...很少的情况下,MYSQL会选择优化不足的索引。...这是使用索引的最慢的连接之一 Using filesort: 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。...它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行 Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
explain 到底会不会执行命令着一点很多人应该是不置可否的任务,他不能执行命令,而仅仅是对语句进行评估然后反馈执行的计划。...所以这里第一点的问题是,函数尽量不要带有和表有关的操作。如果带有和表有关的操作则在explain的情况下会出现上面的问题,想象中是查看执行计划,但结果是操作了这个语句。...那么出现这样的问题,如果要进行执行计划的查看,但是又不想不运行这个函数,可以通过在执行explain 语句的情况前添加事务的方法,来规避一些风险。...同时在MYSQL 8 中的后续命令 explain analyze 命令是否也有这个问题我们看一下,从下面的图可以看出,MYSQL 8 中新添加了的 explain ananlyze 实际上在命令的安全方面和之前没有太大的变化...关于MYSQL 8 中的的 explain analyze 这个命令如果感兴趣的可以查看 https://mysqlserverteam.com/mysql-explain-analyze/ 这里有详细的说明和使用的方法
MySQL explain explain select/update ......官方文档:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html 都是越小越好,rows * filtered explain 说明 id...select_type 查询类型 table 表 partitions 分区 type 扫描类型 possible_keys 可能索引,包含key key 实际索引 key_len 索引长度 ref 列与索引的比较...rows 扫描出的行数(估算的行数) filtered 按表条件过滤的行百分比 Extra 执行情况的描述和说明 select_type 可以不记住 SIMPLE PRIMARY UNION、DEPENDENT
选择正确的匹配查询结构和数据属性的规划对执行效率是至关重要要的,所以系统包含一个复杂的规划器来试图选择好的规划。你可以使用EXPLAIN命令查看查询规划器创建的任何查询。...通常有不只一种可能的方式做这些操作,所以可能出现不同的节点类型。 EXPLAIN的输出是每个树节点显示一行,内容是基本节点类型和执行节点的消耗评估。...当然下一个问题就是规划器的评估为什么是正确的。我们可以通过EXPLAIN ANALYZE进行考察。 EXPLAIN ANALYZE 通过EXPLAIN ANALYZE可以检查规划器评估的准确性。...某些情况EXPLAIN ANALYZE会显示额外的信息,比如sort和hash节点的时候: Sql代码 ?...注意,延迟的触发器在事务结束前都不会被执行,所以EXPLAIN ANALYZE不会显示。
这可能是除了system和const之外最好的类型。 当主键或唯一非NULL索引的所有字段都被用作join联接时会使用此类型。 eq_r ef可用于使用’='操作符作比较的索引列。...比较的值可以是常量,也可以是使用在此表之前读取的表的列的表达式。 相对于下面的ref区别就是它使用的唯一索引,即主键或唯一索引,而ref使用的是非唯一索引或者普通索引。...4、ref 对于来自前面表的每一行,在此表的索引中可以匹配到多行。若联接只用到索引的最左前缀或索引不是主键或唯一索引时, 使用ref类型(也就是说,此联接能够匹配多行记录)。...要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引 6、ref_or_null 跟ref类型类似,只是增加了null值的比较。实际用的不多。...这里包含两种情况: 一种是查询使用了覆盖索引,那么它只需要扫描索引就可以获得数据,这个效率要比全表扫描要快, 12ALl 没有使用索引,全表扫描 12. extra(重要) EXplain
explain_type中,EXTENDED和PARTITIONS 可不写,默认会输出这两列的信息。...EXPLAIN ANALYZE MySQL 8.0.18 刚刚发布,它包含一个全新的功能 EXPLAIN ANALYZE,用来分析和理解查询如何执行。...这项新功能建立在常规的 EXPLAIN 基础之上,可以看作是 MySQL 8.0 之前添加的 EXPLAIN FORMAT = TREE 的扩展(8.0.17)。...EXPLAIN 除了输出查询计划和估计成本之外,EXPLAIN ANALYZE 还会输出执行计划中各个迭代器的实际成本。...月的数据(上面 EXPLAIN ANALYZE 输出中的第 13 行)。
当你运行一条sql执行很慢的时候,可以使用explain sql,"explain"相当于mysql中的优化器,可以很好的分析性能瓶颈。 ?...如上图,就是explain的执行效果,查询出很多字段,我们主要关注其中比较重要的几个 type:访问的类型,性能从高到低NULL>system>const>eq_ref>ref>fulltext>ref_or_null...unique_subquery>index_subquery>range>index>ALL const:通过索引一次就找到,用到了主键或唯一索引,匹配一行所以很快 index_merge:索引合并的优化方法...range:使用指定范围的行语句出现between、、in等 index:只遍历索引树查询 all:全表查询 key:使用到的索引 rows:找到结果所需要读取的行 官网的解释:https...://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-join-types
“MySQL 5.6.3以前只能EXPLAIN SELECT; 5.6.3以后就可以EXPLAIN SELECT,UPDATE,DELETE 有这样一张user表,300多万行记录,表结构及索引信息如下...---- 4.partitions 5.7以前,该项是explain partitions显示的选项; 5.7以后成为了默认选项....建议在explain时先去除limit 11.filtered 这个字段表示存储引擎返回的数据在server层过滤后, 剩下多少满足查询的记录数量的比例; 注意是百分比,不是具体记录数. 12....Extra 非常重要的一个字段 explain 中的很多额外信息会在 Extra 字段显示, 常见的有以下几种内容: distinct:在select部分使用了distinc关键字 Using filesort...[1] mysql 索引type介绍[2] MySQL优化:定位慢查询的两种方法以及使用explain分析SQL[3] limit 会对explain的type产生巨大影响 关于order by的优化
了,从而就可以对这些语句进行调优优化,使用 Explain来分析 SQL 语句的性能。...=3#慢查询日志以文件的形式输出log_output=FILE基本介绍 Explain被称为执行计划,在语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,模拟MySQL优化器来执行...Explain结果是基于数据表中现有数据的。Explain结果与MySQL版本有很大的关系,不同版本的优化器的优化策略不同。...语法:explain sql语句示例:mysql> explain select * from actor;+----+-------------+-------+------+------------...Explain结果列解读概述 字段解释id每个被独立执行的操作标识,标识对象被操作的顺序,id值越大,先被执行,如果相同,执行顺序从上到下table被操作的对象名称,通常是表名,但有其他格式partitions