---- explain结果各列含义: 一、id :select查询的序列号 二、select_type:select查询的类型,主要是区别 普通查询和联合查询、子查询之类的复杂查询。...1.SIMPLE:查询中不包含子查询或者UNION 2.PRIMARY: 查询中若包含任何复杂的子部分,最外层查询被标记为PRIMARY 3.SUBQUERY: 在SELECT或WHERE列表中包含了子查询...4.DERIVED(衍生): 在FROM列表中包含的子查询 5.UNION:UNION中的第二个或后面的SELECT语句 6.UNION RESULT: UNION结果 三、table: 查询表 四...ALL: 扫描全表 index: 只遍历索引树,直接从索引中就可以获取数据满足查询, 而不需要再去查询数据表中的数据....Using filesort: MySQL中无法利用索引完成的排序操作称为“文件排序”。它跟文件没有任何关系,实际上是内部的一个快速排序。
,如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUIT) table 访问引用哪个表(引用某个查询,如“derived3”)...select_type 常见类型及其含义 SIMPLE:不包含子查询或者 UNION 操作的查询 PRIMARY:查询中如果包含任何子查询,那么最外层的查询则被标记为...PRIMARY SUBQUERY:子查询中第一个 SELECT DEPENDENT SUBQUERY:子查询中的第一个 SELECT,取决于外部查询 UNION:UNION 操作的第二个或者之后的查询...,此时不需要访问表,从索引中就可以获取到所需的全部数据 Using index condition:查找使用了索引,但是需要回表查询数据 Using temporary:表示需要使用临时表来处理查询,常出现在...使用 ISNULL()来判断是否为 NULL 值 说明:NULL 与任何值的直接比较都为 NULL # 1) NULLNULL 的返回结果是 NULL,而不是 false。
UNION UNION中第二个或之后的SELECT语句取决于外面的查询 UNION RESULT UNION的结果 SUBQUERY 子查询中的第一个SELECT DEPENDENT SUBQUERY...子查询中的第一个SELECT, 取决于外面的查询 DERIVED 衍生表(FROM子句中的子查询) MATERIALIZED 物化子查询 UNCACHEABLE SUBQUERY 结果集无法缓存的子查询...,必须重新评估外部查询的每一行 UNCACHEABLE UNION UNION中第二个或之后的SELECT,属于无法缓存的子查询 3、table:查询的表名 4、type:查询类型,表示从表中查询到行所执行的方式...join buffer 表明使用了连接缓存,如在查询的时候会有多次join,则可能会产生临时表 impossible where 表示where子句的值总是false,不能用来获取任何元祖 2 优化大数据量下的分页查询...优化建议 通过子查询的方式,先获取数据起始点id,然后根据该值获取需要的偏移量数据。 ? 优化之后的语句: select * from `demo`.
,如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUIT) table 访问引用哪个表(引用某个查询,如“derived3”) type 数据访问...index、filesort等 select_type 常见类型及其含义 「SIMPLE」:不包含子查询或者 UNION 操作的查询 「PRIMARY」:查询中如果包含任何子查询,那么最外层的查询则被标记为...PRIMARY 「SUBQUERY」:子查询中第一个 SELECT 「DEPENDENT SUBQUERY」:子查询中的第一个 SELECT,取决于外部查询 「UNION」:UNION 操作的第二个或者之后的查询...,此时不需要访问表,从索引中就可以获取到所需的全部数据 「Using temporary」:表示需要使用临时表来处理查询,常出现在 GROUP BY 或 ORDER BY 语句中 如何查看Mysql优化器优化之后的...使用 ISNULL()来判断是否为 NULL 值 说明:NULL 与任何值的直接比较都为 NULL # 1) NULLNULL 的返回结果是 NULL,而不是 false。
PRIMARY(primary):子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY。...SUBQUERY(subquery):子查询中的第一个SELECT,结果不依赖于外部查询。...DEPENDENT SUBQUERY(dependent subquery):子查询中的第一个SELECT,依赖于外部查询。...可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)。...key_len显示的值为索引字段的最大可能长度, 并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。 9 ref 使用哪个列或常数,与索引一起被用于从表中查找索引列上的值。
如果语句中使用了子查询、集合操作、临时表等情况,会给ID列带来很大的复杂性。如上例中,WHERE部分使用了子查询,其id=2的行表示一个关联子查询。 select_type 语句所使用的查询类型。...DEPENDENT UNION 子查询中的UNION,且为UNION中从第二个SELECT开始的后面所有SELECT,同样依赖于外部查询的结果集。...PRIMARY 子查询中的最外层查询,注意并不是主键查询。 SIMPLE 除子查询或UNION之外的其他查询。 SUBQUERY 子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集。...UNCACHEABLE SUBQUERY 结果集无法缓存的子查询。 UNION UNION语句中的第二个SELECT开始后面的所有SELECT,第一个SELECT为PRIMARY。...UNION RESULT UNION中的合并结果。从UNION临时表获取结果的SELECT。 DERIVED 衍生表查询(FROM子句中的子查询)。MySQL会递归执行这些子查询,把结果放在临时表里。
我们在查询语句前加上Explain,即可获取该语句的执行计划。 EXPLAIN SELECT * from member; 运行结果 详解 下面我将解释每个字段的含义。...SIMPLE:简单的查询,不包含子查询和union explain select * from emp; PRIMARY:查询中若包含任何复杂的子查询,最外层查询则被标记为PRIMARY EXPLAIN...union select empno from emp where sal >2000) UNION RESULT:从UNION表获取结果的SELECT explain select * from...emp where deptno = 10 union select * from emp where sal >2000; SUBQUERY:在SELECT或者WHERE列表中包含子查询 explain...,直接从索引中读取数据,而不用访问数据表。
---- explain结果各列含义: 一、id :select查询的序列号 二、select_type: select查询的类型,主要是区别 普通查询和联合查询、子查询之类的复杂查询。...SIMPLE:查询中不包含子查询或者UNION PRIMARY: 查询中若包含任何复杂的子部分,最外层查询被标记为PRIMARY SUBQUERY: 在SELECT或WHERE列表中包含了子查询 DERIVED...(衍生): 在FROM列表中包含的子查询 UNION:UNION中的第二个或后面的SELECT语句 UNION RESULT: UNION结果 三、table: 查询表 四、type显示的是访问类型,...ALL: 扫描全表 index: 只遍历索引树,直接从索引中就可以获取数据满足查询, 而不需要再去查询数据表中的数据....Using filesort: MySQL中无法利用索引完成的排序操作称为“文件排序”。它跟文件没有任何关系,实际上是内部的一个快速排序。
这是SELECT的查询序列号 我的理解是SQL执行的顺序的标识,SQL从大到小的执行 id相同时,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id如果相同,可以认为是一组...select子句的类型 SIMPLE(简单SELECT,不使用UNION或子查询等) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY) UNION...语句中第二个select开始后面所有select) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询...filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序” 测试Extra的filesort explain select * from emp order...Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行 No tables used:Query语句中使用from dual 或不含任何
select_type select_type表示sql语句查询的类型。具体表示如下表: select_type的值 含义 SIMPLE 简单的select查询,没有使用关联和子查询。...PRIMARY 最外层select,包含子查询的时候,最外层的查询 UNION 在一个UNION查询中,第二次或以后的子查询操作 DEPENDENT UNION 在一个UNION查询中,第二次子查询或以后的...无法缓存结果的子查询,必须为外部查询的每一行重新计算 UNCACHEABLE UNION UNION中的第二个或以后的不可缓存的子查询。 ...Full scan on NULL key当优化程序无法使用索引查找访问方法时,子查询优化将作为回退策略发生。 Impossible HAVING该HAVING子句始终为false,无法选择任何行。...Impossible WHERE 该WHERE子句始终为false,无法选择任何行。
,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 select_type:查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询 1、SIMPLE:简单的select...查询,查询中不包含子查询或者union 2、PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为 primary 3、SUBQUERY:在select 或 where...列表中包含了子查询 4、DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里 5、UNION:若第二个select...出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived 6、UNION RESULT:从union表获取结果的select...就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。
,越先执行 select_type 查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询 SIMPLE > > 简单的 select 查询,查询中不包含子查询或者UNION PRIMARY...> > 查询中若包含任何复杂的子部分,最外层查询则被标记为Primary SUBQUERY > > 在SELECT或WHERE列表中包含了子查询 DERIVED > > 在FROM...DEPENDENT SUBQUERY > > 在SELECT或WHERE列表中包含了子查询,子查询基于外层 > UNCACHEABLE SUBQUREY > 无法被缓存的子查询 UNION >...从UNION表获取结果的SELECT table 显示这一行的数据是关于哪张表的 type 访问类型排列 显示查询使用了何种类型 性能从最好到最差依次排列如下: system > > 表只有一行记录...using join buffe 使用了连接缓存: impossible where where子句的值总是false,不能用来获取任何元组 select tables optimized
索引确实是一种查找数据的高效方式,但是MySQL也可以使用索引来直接获取列的数据,这样就不再需要读取数据行。如果索引的叶子节点中已经包含要查询的数据,那么还有什么必要再回到表中查询呢?...覆盖索引对于I/O密集型的应用也有帮助,因为索引比数据更小,更容易全部放入内存中。 因为索引是按照列值顺序存储的,所以对于I/O密集型的范围查询会比随机从磁盘读取每一行数据的I/O要少的多。...image.png 这里索引无法覆盖该查询,有两个原因: 没有任何索引能够覆盖这个查询。因为查询从表中选择了所有的列,而没有任何索引覆盖了所有的列。...在FROM子句的子查询中找到匹配的id,然后根据这些id值在外层查询匹配获取需要的所有列值。虽然无法使用索引覆盖整个查询,但总算比完全无法利用索引覆盖的好吧。 数据量大了怎么办?...实例3中,子查询效率反而下降。因为索引过滤时符合第一个条件的结果集已经很小了,所以子查询带来的成本反而比从表中直接提取完整行更高。
PRIMARY : 查询中若包含任何复杂的子查询部分,这个类型代表最外层的。 SUBQUERY: 在SELECT或WHERE列表中包含了子查询。...UNION RESULT: 从UNION表获取结果的SELECT。 1.4 当前数据表名 table: 查询当前这一行数据是关于哪个表的。...覆盖索引(Covering Index) : 就是 select 的查询的列从索引中就可以获取到,而不必去读取表中的原始数据,MySQL可以利用索引返回 select 列表中的字段,而不必根据索引再次读取数据文件...// t1表中存在 index_col1_col2 聚合索引 select col1,clo2 from t1; // 我们只查询 col1和col2,并且这两个字段的数据都可以从索引中获取,此时叫做索引覆盖...impossible where: where子句中的值总是false,不能用来获取任何元组。(就比如找一个人,给定的查询条件,性别既是男性又是女性)
但在分析这四种查询的方法,以及产生的不同效果中,可以看到 select distinct de.dept_name from departments as de where exists (select...那问题就来了,不是说子查询慢吗,子查询是如何进行查询的,但实际上为什么在这个例子不慢。 MySQL子查询是从外部到内部评估查询。也就是说,它首先获取外层表达式的值,然后运行子查询并捕获它生成的行。...对于子查询有用的优化是“通知”子查询,只有内部表达式的条件等于外部表达式的那些行才可以进行优化,将一个适当的等式下推到子查询的WHERE子句中来实现的。...问题是 or 这个操作 您的另外进行一个表操作的问题,另外还有无法在ICP 下推了,主要的原因是NULL 在数据库里面并不是FALSE 而是未知的状态,ICP 下推必须要进行适当的计算,必须能够检查SELECT...是否已经产生了任何行,这样内部条件 = 外部条件就不能下推到子查询中。
、key、key_len、ref、rows、Extra,下面对这些字段出现的可能进行解释: 一、 id SQL执行的顺序的标识,SQL从大到小的执行 id相同时,执行顺序由上至下 如果是子查询,...id的序号会递增,id值越大优先级越高,越先被执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 二、select_type 示查询中每个select...子句的类型 (1) SIMPLE(简单SELECT,不使用UNION或子查询等) (2) PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY) (3) UNION(...) (6) SUBQUERY(子查询中的第一个SELECT) (7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询) (8) DERIVED(派生表的SELECT...“文件排序” Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。
大家好,又见面了,我是你们的朋友全栈君。...where子句中,称为嵌套查询,其中外层查询也称为父查询,主查询,内层查询也称子查询,从查询。...子查询的语法规则 1、子查询的select查询总是使用圆括号括起来。 2、不能包括compute或for.browse子句。 3、如果同时指定top子句,则可能只包括order by子句。...4、子查询最多可以嵌套到32层。个别查询可能会不支持32层嵌套。 5、任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。...6、如果某个表只出现在子查询中二不出现在外部查询中,那么该表的列就无法包含在输出中。
id相同时,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 select_type...类型 说明 SIMPLE 简单SELECT,不使用UNION或子查询等 PRIMARY 子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY UNION UNION...开始后面所有select SUBQUERY 子查询中的第一个SELECT,结果不依赖于外部查询 DEPENDENT SUBQUERY 子查询中的第一个SELECT,依赖于外部查询 DERIVED 派生表的...SELECT, FROM子句的子查询 UNCACHEABLE SUBQUERY 一个子查询的结果不能被缓存,必须重新评估外链接的第一行 table 显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的...filesort 当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序” Using join buffer 该值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果
可以在任何可以使用表达式的地方使用子查询。许多子查询返回单个列值,因为它们与比较运算符(=,!=,,> =)或表达式结合使用。当子查询不用作表达式或使用比较运算符时,它可以返回多个值。...相关子查询使用外部查询中的列或列来约束从相关子查询返回的结果。这对于本文的相关子查询足够了。我将在未来的楼梯文章中探索相关的子查询。...列列表中的子查询 列列表中的子查询是SELECT语句,它返回放置在SELECT子句的列列表中的单个列值。...[Product] WHERE Name like '%XL%'); 清单9:使用子查询将值传递给IN关键字 清单9中的代码使用一个子查询从Product.Product表中返回不同的...语句中的子查询 在清单10中的代码中,我使用一个子查询来计算要插入列MaxOrderDate的值。
OQL支持多表(实体)查询的,但却无法支持自连接查询,原因是自连接查询必须指定表的别名: SELECT R1.readerid,R1.readername,R1.unit,R1.bookcount FROM...,不能像SQL那么灵活的进行各种子查询,其实不支持的原因其中一个也是因为OQL查询不支持表的别名,另外一个原因是子查询无法获取到父查询的表名和字段名。...其他问题只能通过子查询提出。在 Transact-SQL 中,包含子查询的语句和语义上等效的不包含子查询的语句在性能上通常没有差别。但是,在一些必须检查存在性的情况中,使用联接会产生更好的性能。...因此可能出现OQLCompare使用的实体类在OQL中没有使用,从而产生错误的查询; OQLCompare中的的字段名与OQL缺乏相关性,因此只能通过“表名称.字段名称”这种形式来使用属性字段名,无法使用别名...不要小看这个问题,前面我说到的那个5000行业务代码构建SQL查询条件的事情,就曾经发生过构造了128层括号的事情,最终导致SQLSERVER报错: 查询条件括号嵌套太多,查询分析器无法处理!
领取专属 10元无门槛券
手把手带您无忧上云