Mysql执行计划分析-type(access_type)

摘要:
对于主键或唯一索引的常量查询,表中只有1行记录可以满足查询。解释从myshop.ecs_users_id=1中选择*;输出类型是const常量查询3,eq_ref eq_ref使用PRIMARY KEY或UNIQUE来匹配前一个结果集。解释从myshop.ecs_order_infob、myshop.eus_usersawhereb.user_id=a.user_id中选择*;输出ID从上到下两次为1。第一次查询表b,类型=ALL,即第二次查询表a,基于前一个表4的主键,非聚集索引的ref ref常量查询。

  access_type 即下图执行计划的 type 字段

  Mysql执行计划分析-type(access_type)第1张

一、type(access_type) 以下类型

    Mysql执行计划分析-type(access_type)第2张

二、类型示例

1、NULL

  NULL 不访问任何一个表

EXPLAIN select 1 from dual;

  输出

Mysql执行计划分析-type(access_type)第3张

   Extra, 没有用到表。

2、system 和 const

  system 根据主键查询系统表且这个表只有一条记录【特殊的const场景】

  const 常量查询非常快。主键或者唯一索引的常量查询,表格最多只有1行记录符合查询。

EXPLAIN select * from myshop.ecs_users where user_id =1;

  输出

Mysql执行计划分析-type(access_type)第4张

   type 为 const 常量查询

3、eq_ref

  eq_ref 使用PRIMARYKEY或者UNIQUE 和前面的结果集匹配。

  EXPLAIN select * from myshop.ecs_order_info b, myshop.ecs_users a where b.user_id = a.user_id;

  输出

Mysql执行计划分析-type(access_type)第5张

  两次 id 为 1, 从上到下。

  第一次,查询 b 表, type 为 ALL 即全表扫描

  第二次查询 a 表,基于前面表的主键查询

4、ref

  ref 非聚集索引的常量查询。

EXPLAIN select * from myshop.ecs_users where email = 'onlyoneemail.com';

   输出

Mysql执行计划分析-type(access_type)第6张

   ref 是 const 来自常量匹配,来自传入的参数

5、fulltext

  fulltext 查询的过程中,使用到了 fulltext 索引(fulltext index在innodb引擎中,只有5.6版本之后的支持)

EXPLAIN SELECT * FROM `demo-fulltext` WHERE MATCH(`remark`) AGAINST('Tony');

   输出

Mysql执行计划分析-type(access_type)第7张

6、ref_or_null 

  ref_or_null 跟ref查询类似,在ref的查询基础上,加多一个null值的条件查询

EXPLAIN select * from myshop.ecs_users where email = 'onlyoneemail.com' OR email is null;

   输出

Mysql执行计划分析-type(access_type)第8张

7、index_merge 

  index_merge 索引合并(分别两个查询条件的结果,再合并)

EXPLAIN select * from myshop.ecs_users where email = 'onlyoneemail.com' OR user_id = 1;

   输出

Mysql执行计划分析-type(access_type)第9张

8、unique_subquery

  unique_subquery IN子查询的结果由聚族索引或唯一索引覆盖。

SET optimizer_switch='materialization=off';
EXPLAIN select * from myshop.ecs_users where user_id not in (
select user_id from myshop.ecs_users where email like '%.com%' );
SET optimizer_switch='materialization=on';

   输出

Mysql执行计划分析-type(access_type)第10张

9、index_subquery 

  index_subquery 与unique_subquery类似,但是用的是二级索引

SET optimizer_switch='materialization=off';
EXPLAIN select * from myshop.ecs_users where email not in (
select email from myshop.ecs_users where email like '%.com%' );
SET optimizer_switch='materialization=on';

   输出

Mysql执行计划分析-type(access_type)第11张


10、range

  =、<>、>、>=、<、<=、IS NULL、BETWEEN、IN、<=> (这是个表达式:左边可以推出右边,右边也可推出左边)

EXPLAIN select order_id from myshop.ecs_order_info where order_id < 10;

  输出

Mysql执行计划分析-type(access_type)第12张

   type 为 range

11、full index scan

  index 执行full index scan直接从索引中取的想要的结果数据,也就是可以避免回表

EXPLAIN select order_id from myshop.ecs_order_info;

  输出

Mysql执行计划分析-type(access_type)第13张

12、full table scan

   ALL 执行full table scan,这事最差的一种方式

EXPLAIN select pay_fee from myshop.ecs_order_info;

   输出

Mysql执行计划分析-type(access_type)第14张

   没有索引,就是全表扫描, type 就是 ALL

免责声明:文章转载自《Mysql执行计划分析-type(access_type)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[HDOJ2065]"红色病毒"问题JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mysql 修改默认端口

Mysql修改默认端口         0~1023端口为计算机公认端口(Well Known Ports),它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。         其他端口可用于自定义端口,但事先需要明确该端口是否被占用。         mysql默认端口为3306,有时候我们需要修改端口,这个时候可以在...

存储过程中SELECT INTO的使用

在MySQL存储过程中使用SELECT …INTO语句为变量赋值:   用来将查询返回的一行的各个列值保存到局部变量中。 要求:   查询的结果集中只能有1行。 SELECT col_name[,...] INTO var_name[,...] table_expr 使用SELECT …INTO语句在数据库中进行查询,并将得到的结果赋值给变量。   ①co...

docker中mysql安装,并使用宿主机ip远程登录

 docker 安装  1、拉取镜像 docker pull mysql:5.7 2、运行容器  docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 docker exec -it mysql /bin/bash find / -name "*mys...

MySQL统计库表大小

统计每个库每个表的大小是数据治理的其中最简单的一个要求,本文将从抽样统计结果及精确统计结果两方面来统计MySQL的每个库每个表的数据量情况。 1、统计预估数据量 mysql数据字典库information_schema里记录了统计的预估数据量(innodb引擎表不准确,MyISAM引擎表准确)及数据大小、索引大小及表碎片的大小等信息。 如果想了解每个库及表...

mysql日期加减

一、MySQL 为日期增加一个时间间隔:date_add()。 1、  示例: set @dt = now(); select date_add(@dt, interval 1 day);           - 加1天 select date_add(@dt, interval 1 hour);                -加1小时 select d...

MySQL延迟复制--percona-toolkit和MASTER TO MASTER_DELAY

为了数据的安全,有的时候数据库需要延迟备份,这里说下两种延迟备份的方法。 一、借助工具。 实现环境: 192.168.189.143 (mysql主库) 192.168.189.144 (mysql备库,延迟3分钟) 步骤: 1:在服务器上安装mysql,并配置主从复制。(省略) 2:查看144从库的复制状态,确认同步正常,也可在主库上写入数据测试。 3...