专栏首页jouypubMySQL explain命令详解
原创

MySQL explain命令详解

explain显示了MySQL如何使用索引来处理SELECT语句以及连接表。在分析慢查询时,可以帮助选择更好的索引和写出更优的查询语句。

使用方法:

explain select id,name from a,b where a.id = b.id

explain列的解释:

意义

Distinct

一旦MySQL找到了与行相联合匹配的行,就不再搜索了。

type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为 const、eq_reg、ref、range、index和ALL。

possible_keys

显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句。

key

实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname) 来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引。

key_len

使用的索引的长度。在不损失精确性的情况下,长度越短越好。

ref

显示索引的哪一列被使用了,如果可能的话,是一个常数。

rows

MySQL认为必须检查的用来返回请求数据的行数。

Extra

关于MySQL如何解析查询的额外信息。将在下表中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MySQL根本不能使用索引,结果是检索会很慢。

extra列返回的描述的意义:

意义

Distinct

一旦MySQL找到了与行相联合匹配的行,就不再搜索了。

Not exists

MySQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了。

Range checked for each Record(index map:#)

没有找到理想的索引,因此对于从前面表中来的每一个行组合,MySQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一。

Using filesort

看到这个的时候,查询就需要优化了。MySQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行。

Using index

列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。

Using temporary

看到这个的时候,查询需要优化了。这里,MySQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上。

Where used

使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)。

system

表只有一行 system 表。这是const连接类型的特殊情况 。

const

表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MySQL先读这个值然后把它当做常数来对待。

eq_ref

在连接中,MySQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用。

ref

这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好。

range

这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况。

index

这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)。

ALL

这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。

欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com

简书主页:https://www.jianshu.com/u/756c9c8ae984

segmentfault主页:https://segmentfault.com/blog/jouypub

腾讯云主页:https://cloud.tencent.com/developer/column/72548

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PageHelper插件一对多查询时的分页问题

    项目中经常会使用到一对多的查询场景,但是PageHelper对这种嵌套查询的支持不够,如果是一对多的列表查询,返回的分页结果是不对的

    JouyPub
  • 区块链的跨链技术

      早期跨链技术包括以瑞波和BTC Relay为代表,它们更多关注的是资产转移;现有跨链技术以Polkadot和Cosmos为代表更多关注的是跨链基础设施;新出...

    JouyPub
  • Redis百亿级Key存储方案

    该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关...

    JouyPub
  • zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》

    zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同时作为分布式系统的它是怎么保证扩展性的?问题很多...

    Java知音
  • Python目录下中没有Script文件

    Python目录中没有Script文件夹,里面是些easy_install相关的内容,直接安装setuptools即可自动生成Script文件夹。

    py3study
  • Mac系统下查看和生成SSH Key

    your_email:这里填写你在GitLab或者GitHub注册时的邮箱。 后面的提示直接敲回车,一路完成。

    赵哥窟
  • mac使用github

    用户1437675
  • odoo10源码win系统开发环境安装图文教程

    odoo10的源码安装教程不太完整或对新手不够友好,本新手再次整合出一份友好的新手教程(老鸟慎入)

    菲宇
  • 二、VueJs 填坑日记之基础项目构建

    在上一篇文章中,大致介绍了一下本系列博文以及学习vuejs我们需要了解的一些概念,希望大家认真阅读,所谓知己知彼,百战百胜,学习也一样,工欲善其事,必先利其器,...

    I Tech You_我教你
  • 顾宇:成功的微服务应该是什么样 — 组织篇

    4 月在深圳的 GOPS 大会上我分享了“落地微服务的难点和如何高效落地微服务”,这是我 2017 年 4 月份开始做的项目总结,后来发表到了自己的博客和” T...

    DevOps时代

扫码关注云+社区

领取腾讯云代金券