SUBQUERY 子查询的第一个select(不依赖外部查询) DEPENDENT SUBQUERY 依赖于外部查询的子查询 ...( SELECT * FROM s1 WHERE key1 > 'z' AND key1 LIKE '%a';) Using where 当我们使用全表扫描来执行对某个表的查询...,并且该语句的 WHERE 子句中有针对该表的搜索条件时,在Extra 列中会提示上述额外信息。... NULL 值的搜索条件,而且那个列又是不允许存储 NULL 值的,那么在该表的执行计划的 Extra 列就会提示 Not exists 额外信息( EXPLAIN SELECT * FROM s1 LEFT...MySQL 很有可能寻求通过建立内部的临时表来执行查询。
SELECT查询的时候需要依赖外部的查询 UNION RESULT UNION的返回结果集 SUBQUERY 子查询语句的第一个select语句 DEPENDENT SUBQUERY 依赖外部查询的第一个子查询...可能是一个派生表,例如来自FROM子句的结果集。 3.subqueryN 当前行指向一个子查询的结果集。 type 连接类型。该列输出表示如何连接表。...使用“=”运算符来进行索引列的比较。 4.ref 非唯一索引扫描,返回某个匹配值的所有行。常用语非唯一索引。...排序是通过根据连接类型遍历所有行并将排序键和指针存储到与该WHERE子句匹配的所有行的行来完成的。...Zero limit 查询有一个LIMIT 0子句,不能选择任何行。 Only index 这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
什么是执行计划 根据表、列、索引和WHERE子句中的条件的详细信息,MySQL优化器考虑了许多技术来有效地执行SQL查询中涉及的查找。...「关联/相关子查询」:子查询的执行依赖于外部查询。多数情况下是子查询的 WHERE 子句中引用了外部查询包含的列。 ❞ id SELECT查询的系列号,可以为NULL。...第二条记录的 table 列的值是subquery2>,说明该表 其实就是 id 为 2 对应的子查询执行之后产生的物化表,然后将 s1 和该物化表进行连接查询 UNCACHEABLE SUBQUERY...EXPLAIN SELECT * FROM `user` WHERE id = 1 eq_ref :在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问,或者如果该主键或者唯一二级索引是联合索引的话...Impossible WHERE:查询语句的WHERE子句永远为FALSE时将会提示该额外信息 Zero limit:当LIMIT子句的参数为0时,表示并不打算从表中读出任何记录,将会提示该额外信息。
查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序 id号分为三种情况: 1、如果id相同,那么执行顺序从上到下 2、如果id不同,如果是子查询,id的序号会递增,id值越大优先级越高...:简单子查询、所谓的派生表、UNION查询,下面是一个简单的子查询:explain select (select 1 from actor limit 1) from film ?...显而易见的范围扫描是带有between或在where子句中带有 > 的查询。 ref 这是一种索引访问,也有的叫索引查找。它返回所有匹配某个单值的行。...举例来说,如果你通过将某一行的主键放入where子句里的方式来选取此行的主键,mysql就能把这个查询转换为一个常量。...NULL 这中访问方式意味着mysql能在优化阶段分解查询语句,在执行阶段甚至不用再访问表或者索引,例如,从一个索引列里选取最小值可以通过单独查找索引来完成,不需要在执行时访问表。
说明:NULL值的排序 在MySQL中,把NULL值当做一列值中的最小值对待。 因此,升序排序时,它出现在最前面。 1.4 LIMIT子句 特点说明: MySQL特有的子句。...注意:一旦给表定义了别名,那么原始的表名就不能在出现在该语句的其它子句中了 1.5.2 NATURAL JOIN子句 自动到两张表中查找所有同名同类型的列拿来做连接列,进行相等连接 SELECT...先执行子查询,然后执行外部查询 相关子查询(correlated subquery) 子查询中使用到了外部查询的表中的任何列。...先执行外部查询,然后执行子查询 以上两种类型之下又可以分为: 行子查询(row subquery):返回的结果集是 1 行 N 列 列子查询(column subquery):返回的结果集是...N 行 1列 表子查询(table subquery):返回的结果集是 N 行 N 列 标量子查询(scalar subquery):返回1行1列一个值 子查询示例 创建数据表 1
1个,分组的聚合值个数估计是输入集大小的1/10....2)WHERE子句不依赖表中任何数据,用于评估这样的WHERE: movies=# EXPLAIN SELECT * FROM tapes WHERE 1 1; Result ->Seq Scan...Merge Join Merge Join算子也是连接2个表。需要2个输入集:一个外表和一个内表。每个输入集必须按连接列排序。...=3生成结果行后,merge join移动外表到最后一行,然后将内表推进到匹配行: Merge join通过生成最终结果行(customer_id=4)来完成。...创建hash表后,hash join会读取外表每一行,对连接列(从外表)进行hash,并在临时hash索引种搜索匹配值。Hash join算子可用于执行内连接、左外连接和联合。
select SUBQUERY 子查询中的第一个SELECT,结果不依赖于外部查询 DEPENDENT SUBQUERY 子查询中的第一个SELECT,依赖于外部查询 DERIVED 派生表的SELECT...ref: 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,可能会找多个符合条件的行,属于查找和扫描的混合体。...在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询。...ref 列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 rows 根据表统计信息以及索引选用情况,大致估算出找到所需的记录所需要读取的行数 Extra 包含不适合在其他列中显示...Using where 表明使用where过滤 using join buffer 使用了连接缓存 impossible where where子句的值总是false,不能用来获取任何元组 select
1 如何分析SQL性能 mysql提供了EXPLAIN命令来查看SQL语句的执行计划,其中包含了语句是否有应用索引以及遍历的数据量,举个例子: EXPLAIN SELECT * FROM `user...子查询中的第一个SELECT, 取决于外面的查询 DERIVED 衍生表(FROM子句中的子查询) MATERIALIZED 物化子查询 UNCACHEABLE SUBQUERY 结果集无法缓存的子查询...system 表中只有一行数据 const 通过索引一次就找到了,const用于比较primary key或者unique索引,因为只匹配一行数据 eq_ref 使用唯一索引扫描,常见于多表连接中使用主键和唯一索引作为关联条件...ref 对于来自前面表的每一行,在此表的索引中可以匹配到多行,ref可用于使用'='或''操作符作比较的索引列。 fulltext 使用全文索引的时候是这个类型。...join buffer 表明使用了连接缓存,如在查询的时候会有多次join,则可能会产生临时表 impossible where 表示where子句的值总是false,不能用来获取任何元祖 2 优化大数据量下的分页查询
,N指向子查询,也就是explain结果中的下一列 当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id 注意:MySQL对待这些表和普通表一样...当主键放入where子句时,mysql把这个查询转为一个常量(高效) system 这是const连接类型的一种特例,表仅有一行满足条件。...Using where 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。...where子句的值总是false,不能用来获取任何元组 select tables optimized away 在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM...Using join buffer:该值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
使用专门的外部存储区域进行存储,行内存储指针,然后在外部存储实际的值。...避免使用HAVING筛选数据,而是使用where ORDER BY后面的字段建立索引,利用索引的有序性排序,避免外部排序 如果明确知道只有一条结果返回,limit 1 能够提高效率 2.超过三个表最好不要...SELECTDEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询DERIVED:导出表的SELECT(FROM子句的子查询) table 输出的行所引用的表 type 联接类型...Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。...Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。 Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
Execution Plan引言MySQL 优化器会根据 SQL 语句中的表, 列, 索引和 WHERE 子句中的条件的详细信息, 使用许多技术来有效地执行 SQL 查询....SUBQUERY 中的子查询对外部上下文中的不同集合的值只计算一遍....在这种情况下, 您可以通过检查 WHERE 子句来检查它是否引用了适合索引的某些列或列, 从而提高查询的性能....排序是通过根据连接类型遍历所有行并存储排序键和指向与 WHERE 子句匹配的所有行的行的指针来完成的. 然后对键进行排序, 并按排序顺序检索行....如果数字完全不同, 您可能会通过 STRAIGHT_JOIN 在 SELECT 语句中使用并尝试在 FROM 子句中以不同的顺序列出表来获得更好的性能.
执行查询时,在查询中列出的所有列都将从对应的表中提取数据;如果你使用的是子查询的方式,则任何在外部查询中没有使用的列,子查询将从查询中忽略它们;如果你的查询没有列出任何的列(如SELECT count(...需要注意的是JOIN与ARRAY JOIN没有任何关系。可以使用具体的tableName来代替subquery>与subquery>。...如果左表与右表一一对应,不存在多余的行时,ANY与ALL的结果相同。可以在会话中通过设置join_default_strictness来指定默认的JOIN修饰符。...USING中指定的列必须在两个子查询中具有相同的名称,而其他列必须具有不同的名称。可以通过使用别名的方式来更改子查询中的列名。USING子句使用的是等值连接。右表(子查询的结果)将会保存在内存中。...语法4:INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...语法4是使用SELECT的结果写入到表中,select中的列类型必须与table中的列类型位置严格一致
,在无法通过索引访问null值的时候使用 7 Impossible HAVING HAVING子句始终为false,不会命中任何行 8 Impossible WHERE WHERE子句始终为false,...这将删除子查询并将其表放入最顶层的查询计划中,从而改进查询的开销。通过合并半连接和反联接,优化器可以更加自由地对执行计划中的表重新排序,在某些情况下,可让查询提速。...index map N索引的编号从1开始,按照与表的SHOW INDEX所示相同的顺序。索引映射值N是指示哪些索引是候选的位掩码值。例如0x19(二进制11001)的值意味着将考虑索引1、4和5。...通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。...36 Using temporary 为了解决该查询,MySQL需要创建一个临时表来保存结果。如果查询包含不同列的GROUP BY和 ORDER BY子句,通常会发生这种情况。
: 对于sql: SELECT * FROM `user` WHERE id > 20000 AND country > 1 AND grade IN ( 1, 4 ) AND..., 对于每个索引键, 表中只有一条记录与之匹配. eq_ref和const的区别: eq_ref 出现于多表join时, 对于来自前表的每一行, 在当前表中只能找到一行....另: key_len只计算where条件用到的索引长度, 而排序和分组就算用到了索引,也不会计算到key_len中. 9.ref 如果使用常数等值查询, 这里会显示const; 如果是连接查询, 被驱动表的执行计划这里会显示驱动表的关联字段..., 如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换, 这里可能显示为func 10.rows 非常重要的一个字段 mysql估算的 需要扫描的行数(不是精确值) 通过这个值,可以非常直观地显示...如果通过使用索引进行排序,这将非常快。如果必须执行文件排序,则在找到第一个 row_count *之前,将选择与查询匹配的所有行,但不带有LIMIT子句,并对其中的大多数或全部进行排序。
mysql> explain select 字段 from 表; 1、执行计划中包含的信息 列名 含义 id id列,表示查询中执行select子句或操作表的顺序。...id select查询的序列号,表示查询中执行select子句或者操作表的顺序 id号分为三种情况: 1、如果id相同,那么执行顺序从上到下 2、如果id不同,如果是子查询,id的序号会递增,id值越大优先级越高...where sal > (select avg(sal) from emp) ; --dependent subquery:subquery的子查询要受到外部表查询的影响 explain select...job from t_job); --unique_subquery:该连接类型类似与index_subquery,使用的是唯一索引 explain select * from emp e where...by deptno limit 10; --using where:使用where进行条件过滤 explain select * from t_user where id = 1; --using
执行计划中各个列代表具体含义解释如下: id: 查询的序号,包含一组数字,表示查询中执行select子句或操作表的顺序 1.id相同,执行顺序从上往下 2.id不同,id值越大,优先级越高,越先执行 select_type...4、Using where :表明使用where过滤 5、using join buffer:使用了连接缓存 6、impossible where:where子句的值总是false,不能用来获取任何元组...primary和subquery primary:查询中若包含任何复杂的子部分,标记最外层查询语句; subquery:在select或where列表中包含子查询,标记子查询语句; explain...这可能是在 const 之外最好的连接类型了,简单的 select 查询不会出现这种 type。 ? id列都是1,当id列值一样时,从上到下执行表。...NULL Extra显示null,表示查询的列未被索引列覆盖,并且where筛选条件是索引的前导列,说明用到了索引, 但是部分字段未被索引列覆盖,必须通过“回表”来实现,所以不是纯粹地用到了索引,也不是完全没用到索引
,表示查询中执行select子句或者操作表的顺序。...`code` DESC LIMIT 1); UNION:若第二个SELECT出现在UNION之后,则被标记为UNION explain select * from emp where deptno...联合而成的结果会受外部表影响 explain select * from emp e where e.empno in ( select empno from emp where deptno = 10...select * from emp where sal > (select avg(sal) from emp); DEPENDENT SUBQUERY:SUBQUERY的子查询要受到外部表查询的影响...没有写出可验证的SQL。 unique_subquery:该连接类型类似与index_subquery,使用的是唯一索引:该连接类型类似与index_subquery,使用的是唯一索引。
(1)id值不同:id值越大优先级越高,越先被执行; (2)id值相同:从上往下依次执行; (3)id列为null:表示这是一个结果集,不需要使用它来进行查询。...(1)system:表中只有一条元组匹配(等于系统表),这是 const 类型的特例,平时不会出现,可以忽略不计。 (2)const:通过索引一次就找到了,表示使用主键索引或者唯一索引。...意味着用到了索引,但是部分字段未被索引覆盖,须通过“回表”来获取查询所需的字段 using temporary 用临时表保存中间结果,常用于GROUP BY 和 ORDER BY操作中,通常是因为group...JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了 impossible where where子句的值总是false distinct 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作...第五:(id = NULL):【 … union … 】:代表从union的临时表中读取行的阶段,table列的 “union 1, 4”表示用id=1 和 id=4 的select结果进行union操作
DERIVED:导出表的SELECT(FROM子句的子查询) MATERIALIZED:物化子查询 UNCACHEABLE SUBQUERY:无法缓存结果的子查询,必须为外部查询的每一行重新计算 UNCACHEABLE...system 该表只有一行(如:系统表)。这是const连接类型的特例 const 该表最多只有一个匹配行,在查询开头读取。因为只有一行,所以优化器的其余部分可以将此行中列的值视为常量。...表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 fulltext 使用FULLTEXT 索引执行连接。...在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。...) 不损失精确性的情况下,长度越短越好 八、ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 九、rows 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
1 id select的识别符,这是select的查询序列号。 如果有两列数据id相同,则为同一组查询,由上到下执行。 如果id值不同,id值越大,优先级越高。...SUBQUERY(subquery):子查询中的第一个SELECT,结果不依赖于外部查询。...这可能是最好的联接类型,除了const类型。 ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。...( 列与索引的比较,表示上述表的连接匹配条件。) 10 rows MySQL认为它执行查询时必须检查的行数既预估扫描的行数。 11 filtered 通过表条件过滤出的行数的百分比估计值。...12 Extra Mysql执行情况的描述和详细说明。 Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
领取专属 10元无门槛券
手把手带您无忧上云