MySQL对derived table的优化处理与使用限制


前言

随着MySQL版本的发展,优化器是越来越智能,优化器开关也越来越多,本文给大家分享一下MySQL对derived table的优化处理。

何为derived table?这里我把它翻译成派生表,简单来讲,就是将from 子句中出现的检索结果集当做一张表,比如from 一个select构造的子查询,这个子查询就是一个派生表,from 一个视图,这个视图就是一个派生表,from 一个with 构造的临时表(Common table expression,CTE),这个CTE表就是一个派生表。

一、优化器对derived table的优化

优化器处理derived table有两种策略:1.将derived table合并到外查询块中,2,将derived table 物化为一个临时表。使用优化器开关derived_merge来控制优化器选择哪种策略。设置为on,选择策略1;设置为off,选择策略2。此开关从5.7.6版本时引入,默认值为on。

8.0.22版本中又引入优化器开关derived_condition_pushdown,默认值为on,表示外查询块中与派生表相关的条件会推入到派生表中,设置为off,则不会推入。

下面实验来说明,接下来本章节实验都是基于MySQL8.0.25。

实验表结构

mysql> show create table t1G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int DEFAULT NULL, `c1` varchar(100) DEFAULT NULL, KEY `idx_id` (`id`), KEY `idx_c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)