explain --select_type列详解:
select_type数据列指明各“单位select 查询”的查询类型,select_type数据列的列值如下所示:
1.simple: 进行不需要Union操作或不含子查询的简单select查询时,响应查询语句的select_type 即为simple(查询中包含连接的情形也一样)。无论查询语句是多么复杂,执行计划中select_type为simple的单位查询一定只有一个。最外侧的select查询的select_type通过为simple EG:SELECT `user_id`, `amount` FROM `coupons` WHERE `locked`= 0 AND `expired_at`= 1476892800
2.primary 一个需要Union操作或含子查询的select查询执行计划中,位于最外层的select_type即为primary。与simple一样,select_type为primary的单位select查询也只存在1个,位于查询最外侧的select单位查询的select_type为primary 3.union 由union操作联合而成的单位select查询中,除第一个外,第二个以后的所有单位select查询的select_type都为union。union的第一个单位select的select_type不是union,而是DERIVED。它是一个临时表,用于存储联合(Union)后的查询结果。
explain
select * from(
(select emp_no from employees el limit 10)
union all
(select emp_no from employees e2 limit 10)
union all
(select emp_no from employees e3 limit 10)
) tb;
以上查询的执行计划如下图所示。3个联合(union)的select 查询中,只有第一个(el数据表)不是union,其余两个的select_type均为union。union的第一个查询设置为代表整个union结果的select_type类型。此外要将3个子查询的结果用union all进行联合,并创建临时表进行使用,所以union all的第一个查询的select_type为DERIVED。
4.DEPENDENT UNION dependent
与UNION select_type一样,dependent union出现在union或union all 形成的集合查询中。此处的dependent表示union或union all联合而成的单位查询受外部影响。下列查询中,两个select 查询用union联合起来,所一union出阿信在select_type中,从in所包含的子查询中可以看到,两个查询通过union连接在一起。MariaDB中,不会在默认优化器模式下先处理IN(subquery)查询内部的子查询,而是读取外部的employees数据表,再执行子查询时,dependent关键字就会出现在select_type中。
explain
select *
from employees e1
where e1.emp_no in(
select e2.emp_no from employees e2 where e2.first_name=Matt union select e3.emp_no from employees e3 where e3.first_name=Matt
);
最后,内部“e2.emp_no=e1.emp_no” 与“e3.emp_no=e1.emp_no”条件会自动添加到union所使用的select查询的where条件,然后再执行。由于外部定义的employees数据表的emp_no数据列要在子查询中使用,所以dependent union关键字出现在select_type中。
注意:一个单位的select查询中还包含其他单位select时,我们将内部的select称为子查询,一个查询中含有子查询时,子查询通常会比外部查询先执行,这种处理方式的速度一般会非常快。但对于select type包含dependent关键字的子查询,由于它要依赖外部查询,所以绝对不会比外部查询先执行。因此,select_type包含dependent关键字的子查询先执行往往会比较低效。
5、union result
union result为包含union结果的数据表。MariaDB中,union all或union(DISTINCT)查询会将所有union结果创建为临时表。执行计划中,该临时表所在行为select_type为union result。由于union result在实际查询中不是单位查询,所以没有单独的id值。
explain
select emp_no from salaries where salary 100000
union all
select emp_no from dept_emp where from_date 2001-01-01
上述执行计划的最后一行(union result)的table列显示为表示它是id分别为1和2的单位查询的查询结果的联合。
到底为什么不建议使用SELECT *? “不要使用SELECT *”几乎已经成为了MySQL使用的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用`*`作为查询的字段列表,本文从4个方面给出理由。
explain的type列解析 单表访问方法在执行计划中就是指type列,下面结合具体的案例说明下我们常见的const、ref、eq_ref、ref_or_null、range、index、index_merge
相关文章
- Golang框架Gin入门实战--(8)Gin中间件详解 路由中间件 全局中间件 路由分组中间件
- java 异或加密_Java异或技操作给任意的文件加密原理及使用详解
- k8s实践(13)--有状态服务StatefulSet详解
- Buffer pool--mysql详解(八)
- Mvcc--mysql详解(十一)
- 行为型模式--设计模式详解?
- 图文详解多种漏洞配合利用--getshell(附脚本)
- OFFICE全版本软件安装下载方法--office2010安装教程步骤详解
- 2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包
- 【OpenGL ES】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
- 使nginx支持pathinfo模式详解程序员
- golang的web框架—beego的api(强烈推荐)详解大数据
- Kafka SSL安装与配置详解大数据
- JAVA 实现tail -f 日志文件监控功能详解编程语言
- Java经典实例:进阶版堆栈实现,支持任何对象类型详解编程语言
- java中遍历实体类属性和类型详解编程语言
- js控制easyui datagrid列的显示和隐藏详解编程语言
- CSS渲染速度改善的十个方法与建议详解编程语言
- Filter配置多个url-pattern详解编程语言
- 根据工号获取姓名详解编程语言
- CRM创建物料FM1详解编程语言
- 拆分全路径名得到路径+文件名[STPU1_EXTRACT_FILENAME]详解编程语言
- 如何读取销售订单行项目特性值-VC_I_GET_CONFIGURATION详解编程语言
- springmvc整合redis架构搭建实例详解编程语言
- SAP-MM知识精解-批次管理(01)- 概览及物料的批次启用详解编程语言
- C++ 自定义比较函数(map和multimap)详解
- Python推导式(列表推导式、元组推导式、字典推导式和集合推导式)详解
- PHP中的函数--foreach()的用法详解
- mysql慢查询使用详解
- C++快速排序的分析与优化详解