【Mysql】derived table派生表

文章目录

  • 1 什么是derived table
  • 2. 什么是derived_merge
  • 3. derived_merge开启和关闭的区别
  • 4. 无法利用derived_merge的情况
    • a. 存在DISTINCT时:
    • b. 存在group by 时:
    • c. 存在UNION/UNION ALL时:
    • d. 存在having时:
    • e. 存在limit时:

Learn from jdh-yfy

1 什么是derived table

派生表为直接或者间接的通过一个查询表达式从一个或者多个表中得到的表。某种意义上来讲,MySQL中的视图也是派生表,如图,这两条SQL语句表A即为派生表。
在这里插入图片描述
【Mysql】derived table派生表_第1张图片

2. 什么是derived_merge

一种查询优化技术,作用就是把派生表合并到外部的查询中,提高数据检索的效率。这个特性在MySQL5.7版本中被引入,默认为 打开,可以通过如下SQL语句进行查看/开启/关闭等操作。
show global variables like ‘%optimizer_switch%’;

derived_merge=on表示开启,如果是off的话表示关闭。

举一个实际的例子,比如对于
select * from (select * from table_name)t where id= 100;
外层查询的条件会推进到派生表的子查询中,实际的执行过程就变为:
select * from (select * from table_name where id =100)t where id= 100

3. derived_merge开启和关闭的区别

在MySQL5.6版本(无derived_merge)的执行情况如下图:
【Mysql】derived table派生表_第2张图片
在MySQL5.7版本(有derived_merge且开启的)的执行情况如下图:
【Mysql】derived table派生表_第3张图片

4. 无法利用derived_merge的情况

当派生子查询存在以下操作时,该特性无法生效。
DISTINCT、 GROUP BY、 UNION/UNION ALL 、 HAVING、 关联子查询、 LIMIT/OFFSET 以及 聚合操作 等

a. 存在DISTINCT时:

【Mysql】derived table派生表_第4张图片

b. 存在group by 时:

【Mysql】derived table派生表_第5张图片

c. 存在UNION/UNION ALL时:

【Mysql】derived table派生表_第6张图片
【Mysql】derived table派生表_第7张图片

d. 存在having时:

【Mysql】derived table派生表_第8张图片

e. 存在limit时:

【Mysql】derived table派生表_第9张图片
【Mysql】derived table派生表_第10张图片

你可能感兴趣的:(java,java,mysql)