首页 > 数据库 >MySQL-explain执行计划

MySQL-explain执行计划

时间:2023-07-31 10:35:52浏览次数:42  
标签:表示 语句 字节 explain 查询 索引 MySQL 执行 用到

explain关键字可以模拟优化器执行SQL语句,分析查询语句的性能

在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,并不会执行这条SQL

explain执行计划

  • id:select语句标识符
id表示查询语句的序号,自动分配,顺序递增,值越大,执行优先级越高;id相同时,优先级由上而下

  • select_type:select语句查询类型
select_type表示查询类型,常见的有SIMPLE简单查询、PRIMARY主查询、SUBQUERY子查询、UNION联合查询、UNION RESULT联合临时表结果等

  • table:查询用到的表
table表示SQL语句查询的表名、表别名、临时表名

  • partitions:查询匹配到的分区
partitions表示SQL查询匹配到的分区,没有分区的话显示NULL

  • type:表连接类型或者数据访问类型
type表示表连接类型或者数据访问类型,就是表之间通过什么方式建立连接的,或者通过什么方式访问到数据的

具体有以下值,性能由好到差依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

system:当表中只有一行记录时,也就是系统表,时const类型的特列

const:表示使用主键索引或者唯一索引进行查询时,最多返回一条数据。性能较好,推荐使用

eq_ref:表示表连接使用到了主键或者唯一索引

ref:表示使用了非唯一索引进行查询

ref_or_null:表示使用了非唯一索引进行查询,并且包含了null值的行

index_merge:表示用到索引合并的优化逻辑,即用到的多个索引

range:表示使用到了索引范围查询

index:表示使用索引进行全表扫描

ALL:表示全表扫描,性能最差

  • possible_keys:可能用到的索引
表示可能用到的索引列,实际查询并不一定能用到

  • key:实际用到的索引
表示实际查询用到索引列

  • key_len:索引长度
表示索引所占的字节数

每种类型所占的字节数如下

类型 占用空间
char(n) n个字节
varchar(n) 2个字节存储变长字符串,如果时utf-8,则长度3n+2
tinyint 1个字节
smallint 2个字节
int 4个字节
bigint 8个字节
date 3个字节
timestamp 4个字节
datetime 8个字节
  • ref:查询条件中的列
表示where语句或者表连接中与索引比较的参数,常见的有const(常量)、func(函数)、字段名

如果没用到索引,则显示为NULL。

  • rows:预计扫描的行数
表示执行SQL语句所扫描的行数

  • filtered:过滤行所占百分比
表示按条件过滤的表行的百分比

  • Extra:附加信息
表示一些额外的扩展信息,不适合在其他列展示,却又十分重要

Using where:表示使用了where条件搜索,但没有使用索引

Using index:表示用到了覆盖索引,即在索引上就查到了所需数据,无需二次回表查询,性能较好

Using filesort:表示使用了外部排序,即排序字段没有用到索引

Using temporary:表示用到了临时表,下面的示例中就是用到临时表来存储查询结果

Using join buffer:表示在进行表关联的时候,没有用到索引,使用了连接缓存区存储临时结果

下面的示例中cert_no在两张表中都没有建索引

Using index condition:表示用到索引下推的优化特性

标签:表示,语句,字节,explain,查询,索引,MySQL,执行,用到
From: https://www.cnblogs.com/coolw/p/17592777.html

相关文章

  • 使用prometheus监控mysql数据库性能指标
    目标:需要实现mysql的性能监控,如cpu占用率,内存占用率,连接数,执行效率等等.......如图所示: 实现思路一:使用linux的top命令,定时查看mysql的cup占用率,内存占用率........,然后将得到的数据存放进入数据库,后端拿到数据库数据,前端拿到数据后,进行数据重组,结合种种图表(echa......
  • 为什么不建议在 Docker 中跑 MySQL
    容器的定义:容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题。目前,容器和Docker依旧是技术领域最热门的词语,无状态的服务容器化已经是大势所趋,同时也带来了一个热点问题被大家所争论不以:数据库MySQL是否需要容器化?认真分析大家的各种观点,发现赞同者仅仅是......
  • 园子的商业化努力-阿里云开发者社区合作:RDS MySQL Serverless 免费试用活动
    阿里云开发者社区这个月组织了一个针对“云数据库RDSMySQLServerless版”免费试用用户的做任务活动,上周找园子合作,希望能在园子里推广一下这个活动。由于时间太紧,今天已经是活动的最后一天,为了做好推广效果,在首页发布这篇推广博文,请大家谅解。和阿里云开发者社区的合作之前......
  • MySQl的基础
    1.MySQl简介MySQl是一个关系型数据库关系型数据库是以表的形式存储和管理数据的关系型数据库的优点,关系明确、支持事务处理和数据的完整性2.MySQl操作MySQl的库可以看作是一个文件夹MySQl的表可以看作是一个文件MySQl的数据可以看作是文件内容2.1库操作......
  • k8s timeoutSeconds无效且没有按照periodSeconds的间隔时间来执行健康检查
    健康检查日志没有严格按照periodSeconds间隔时间来打印。核心代码如下: pkg/kubelet/prober/worker.gopkg/kubelet/prober/prober.gorunProbe方法(kubelet健康检查有3种方式)httpGet发送HTTP请求,返回码介于200~400之间(前闭后开)时检查成功。exec容器中执行命令,当命令执行成功......
  • 12-MySQL数据库的触发器
    12-MySQL数据库的触发器课程目标了解触发器简介。掌握MySQL触发器的创建和使用以及删除。12.1触发器简介触发器是一个被指定关联到一个表的数据库对象,当对一个表的特定事件(例如增、删、改、查表中记录)出现时,它将会被激活。触发器具有MySQL语句在需要时才被执行的特点,即某条(或某......
  • 11-MySQL数据库的存储过程
    11-MySQL数据库的存储过程课程目标了解存储过程简介、关于MySQL的存储过程。掌握MySQL存储过程的创建、调用、查询、修改、删除、控制语句、基本函数。11.1存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(StoredProcedure)是一组为了完......
  • Mysql添加用户并授权
     添加新用户test,设置任意ip登录,密码:qwe123>CREATEUSER'test'@'%'IDENTIFIEDBY'qwe123';授权test账户select,insert操作权限至数据库order全部数据表>GRANTselect,insertONorder.*TO'test'@'%';执行后刷新权限才能生效> FLUSHPRIVILEGE......
  • Mysql数据库常用操作命令
    //创建数据库>create databasedatabase_name;eg;createdatabasesorder;>useorder;//选择数据库>showtables;//显示数据库order创建的所有数据表>dropdatabaseorder;//删除数据库order,删除数据库后,数据表中的数据会全部被删除,所以删除前一定要做好数据......
  • mysql 简单进阶 ———— 重构查询[二]
    前言简单整理一下重构查询。正文为什么我们需要重构查询,原因也很简单,那就是查询慢。为什么会查询慢?查询性能慢底下的最基本的原因是访问的数据太多。某些查询不可避免地需要筛选大量的数据,但这并不常见。大部分性能低下的查询都可以通过减少访问的数据流的方式进行优化。......