MySQL EXPLAIN type类型说明[通俗易懂]

MySQL EXPLAIN type类型说明[通俗易懂]EXPLAIN执行计划中type字段分为以下几种:ALL    INDEX    RANGE    REF    EQ_REF    CONST,SYSTEM    NULL自上而下,性能从最差到最好 type=ALL,全表扫描,MYSQL扫描全表来找到匹配的行(因为film表中rating不是索引)mysql>explainexten…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

EXPLAIN执行计划中type字段分为以下几种:

ALL        

INDEX        

RANGE        

REF        

EQ_REF        

CONST,SYSTEM        

NULL

自上而下,性能从最差到最好

 

type = ALL,全表扫描,MYSQL扫描全表来找到匹配的行

(因为film表中rating不是索引)

mysql> explain extended select * from film where rating > 9\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: film

         type: ALL

possible_keys: NULL

          key: NULL

      key_len: NULL

          ref: NULL

         rows: 1024

     filtered: 100.00

        Extra: Using where

1 row in set, 1 warning (0.00 sec)

 

type = index,索引全扫描,MYSQL遍历整个索引来查找匹配的行。(虽然where条件中没有用到索引,但是要取出的列title是索引包含的列,所以只要全表扫描索引即可,直接使用索引树查找数据)

mysql> explain select title from film\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: film

         type: index

possible_keys: NULL

          key: idx_title

      key_len: 767

          ref: NULL

         rows: 1024

        Extra: Using index

1 row in set (0.00 sec)

 

type = range ,索引范围扫描,常见于<、<=、>、>=、between等操作符(因为customer_id是索引,所以只要查找索引的某个范围即可,通过索引找到具体的数据)

mysql> explain select * from payment where customer_id > 300 and customer_id < 350\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: payment

         type: range

possible_keys: idx_fk_customer_id

          key: idx_fk_customer_id

      key_len: 2

          ref: NULL

         rows: 1294

        Extra: Using where

1 row in set (0.01 sec)

 

type = ref ,使用非唯一性索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行。

(1)使用非唯一性索引customer_id单表查询

mysql> explain select * from payment where customer_id = 350\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: payment

         type: ref

possible_keys: idx_fk_customer_id

          key: idx_fk_customer_id

      key_len: 2

          ref: const

         rows: 23

        Extra:

1 row in set (0.00 sec)

(2)使用非唯一性索引联表查询(由于customer_id在a表中不是主键,是普通索引(非唯一),所以是ref)

mysql> explain select b.*, a.* from payment a ,customer b where a.customer_id = b.customer_id\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: b

         type: ALL

possible_keys: PRIMARY

          key: NULL

      key_len: NULL

          ref: NULL

         rows: 541

        Extra:

*************************** 2. row ***************************

           id: 1

  select_type: SIMPLE

        table: a

         type: ref

possible_keys: idx_fk_customer_id

          key: idx_fk_customer_id

      key_len: 2

          ref: sakila.b.customer_id

         rows: 14

        Extra:

2 rows in set (0.00 sec)  

 

type = eq_ref,相对于ref来说就是使用的是唯一索引,对于每个索引键值,只有唯一的一条匹配记录(在联表查询中使用primary key或者unique key作为关联条件)

(在film和film_text中film_id都是主键,即都是唯一索引)

mysql> explain select * from film a ,film_text b where a.film_id = b.film_id\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: b

         type: ALL

possible_keys: PRIMARY

          key: NULL

      key_len: NULL

          ref: NULL

         rows: 1000

        Extra:

*************************** 2. row ***************************

           id: 1

  select_type: SIMPLE

        table: a

         type: eq_ref

possible_keys: PRIMARY

          key: PRIMARY

      key_len: 2

          ref: sakila.b.film_id

         rows: 1

        Extra: Using where

2 rows in set (0.00 sec)

 

type = const/system,单表中最多只有一条匹配行,查询起来非常迅速,所以这个匹配行中的其他列中的值可以被优化器在当前查询中当做常量来处理。例如根据主键或者唯一索引进行的查询。

mysql> explain select * from film  where film_id = 1\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: film

         type: const

possible_keys: PRIMARY

          key: PRIMARY

      key_len: 2

          ref: const

         rows: 1

        Extra:

1 row in set (0.02 sec)

 

注释:如果上表中film表中只有一行数据,那么type就是system。

 

type = NULL,MYSQL不用访问表或者索引就直接能到结果。

mysql> explain select 1 from dual  where 1\G (dual是一个虚拟的表,可以直接忽略)

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: NULL

         type: NULL

possible_keys: NULL

          key: NULL

      key_len: NULL

          ref: NULL

         rows: NULL

        Extra: No tables used

1 row in set (0.00 sec)

 

mysql> select 1+1 from dual;

+—–+

| 1+1 |

+—–+

|   2 |

+—–+

1 row in set (0.05 sec)

 

explain extended

mysql> explain extended select sum(amount) from customer a ,payment b where 1 = 1 and a.customer_id = b.customer_id and email = ‘JANE.BENNETT@sakilacustomer.org’\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: a

         type: ALL

possible_keys: PRIMARY

          key: NULL

      key_len: NULL

          ref: NULL

         rows: 541

     filtered: 100.00

        Extra: Using where

*************************** 2. row ***************************

           id: 1

  select_type: SIMPLE

        table: b

         type: ref

possible_keys: idx_fk_customer_id

          key: idx_fk_customer_id

      key_len: 2

          ref: sakila.a.customer_id

         rows: 14

     filtered: 100.00

        Extra: 

2 rows in set, 1 warning (0.00 sec)

 

mysql> show warnings\G

*************************** 1. row ***************************

  Level: Note

   Code: 1003

Message: select sum(`sakila`.`b`.`amount`) AS `sum(amount)` from `sakila`.`customer` `a` join `sakila`.`payment` `b` where ((`sakila`.`b`.`customer_id` = `sakila`.`a`.`customer_id`) and (`sakila`.`a`.`email` = ‘JANE.BENNETT@sakilacustomer.org’))

1 row in set (0.00 sec)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183683.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 面试官:说说Vue响应式原理

    面试官:说说Vue响应式原理Vue2 和 Vue3 的响应式原理前言 vue2 的响应式原理主要使用的是 Object defineProper 里面需要传入三个参数 分别是 响应源数据的对象 源数据中的需要读写的属性 相对应的对象方法 包含了 get 和 set 方法 vue3 的响应式原理主要依靠的是 ES6 新增的 Proxy 方法 需要在 Proxy 的实例对象中传入两个参数 源数据对象 处理对象的方法 get set deleteProper 等 从自己个人来说 vue3 感觉比 vue2 更简单了 很多方法封装的更方便使用可以直接在

    2025年9月26日
    5
  • Python(含PyCharm及配置)下载安装以及简单使用(Idea)「建议收藏」

    Python(含PyCharm及配置)下载安装以及简单使用(Idea)「建议收藏」下载Python官网下载地址:Python下载不同参数解释,小伙伴们根据自己情况进行下载即可(此处博主用的是3.7.3版本):–web-basedinstaller:在线安装。下载的是一个exe可执行程序,双击后,该程序自动下载安装文件进行安装。网络安装版,需联网–executableinstaller:程序安装。下载的是一个exe可执行程序,双击进行安装。本地安装,可执行程序(***)–embeddablezipfile:解压安装。下载的是一个压缩文件,解压后即表示安装完成。嵌入式版

    2022年5月31日
    39
  • 图像识别与卷积神经网络

    图像识别与卷积神经网络卷积神经网络是除了全连接神经网络以外另一个常用的网络结果,其在图像识别方面表现十分突出。本文结合Tensorflow:实战Google深度学习框架,讲述卷积神经网络常用数据集,介绍卷积网络的结构思想,以及通过TensorFlow实现其设计。1图像识别数据集MNIST手写体识别数据集解决是一个相对简单的问题,而对于更加复杂的类别,可以用到CIFAR数据集。比如CIFAR10数据集收集了来自10…

    2022年5月30日
    45
  • 函数指针和函数指针数组及其应用

    函数指针和函数指针数组及其应用1.函数指针先来看一个简单的例子。inta=3;void*p=&a;这是一个基础的不能再基础的例子。相信学过指针的都能看得懂。P是一个指针,指向a。a是一个整形变量。函数指针和其类似,只不过其指向的不是一个变量,而是一个函数,仅此而已。话不多说,看个例子。void(*funcPointer)(doublex);voidf1(doublex){}voidf

    2022年7月15日
    19
  • Android开发被添加到桌面快捷方式

    Android开发被添加到桌面快捷方式

    2022年1月13日
    65
  • 【BZOJ】2165: 大楼

    【BZOJ】2165: 大楼

    2021年5月26日
    87

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号