【Mysql】Explain执行计划之select_type列

10
/* 
 注意先把优化器关了
*/
SET SESSION optimizer_switch ='index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,mrr=off,mrr_cost_based=off,block_nested_loop=off,batched_key_access=off,materialization=off,semijoin=off,loosescan=off,firstmatch=off,duplicateweedout=off,subquery_materialization_cost_based=off,use_index_extensions=off,condition_fanout_filter=off,derived_merge=off,prefer_ordering_index=off';

/*
 子查询执行过程
 1.从外层查询中取出一个元组(即一行),将元组相关列的值传给内层查询。
 2.执行内层查询,得到子查询操作的值。
 3.外查询根据子查询返回的结果或结果集得到满足条件的行。
 4.然后外层查询取出下一个元组重复做步骤1-3,直到外层的元组全部处理完毕。
*/

/*
 SIMPLE
*/
EXPLAIN
SELECT *
FROM contents;

/*
 PRIMARY
 UNION
 UNION RESULT
*/
EXPLAIN
SELECT * FROM contents
UNION
SELECT * FROM contents;

/*
 PRIMARY
 DEPENDENT SUBQUERY
 DEPENDENT UNION
 UNION RESULT
*/
EXPLAIN
SELECT *
FROM contents c
WHERE c.post_id in (
  SELECT c1.post_id FROM contents c1
  UNION
  SELECT c2.post_id FROM contents c2
);

/*
 PRIMARY
 SUBQUERY
*/
EXPLAIN
SELECT c.*, (SELECT post_id FROM contents WHERE post_id = 2)
FROM contents c;

/*
 PRIMARY
 DEPENDENT SUBQUERY
 */
EXPLAIN
SELECT c.*
FROM contents c
WHERE c.post_id IN (SELECT p.id FROM posts p);

/*
 DERIVED 出现在 FROM 子句中的子查询
 */
EXPLAIN
SELECT c.*
FROM (SELECT * FROM contents) c;