首页 > 数据库 >mysql explain

mysql explain

时间:2023-09-08 15:55:33浏览次数:37  
标签:语句 UNION explain 查询 索引 mysql SELECT

MYSQL Explain 解析

explain说明

用于查看sql语句都执行计划,可以看到sql语句都执行了哪些索引,以及执行的顺序等等。

主要作用是优化sql语句,提高sql语句的执行效率。

| id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |

id

select查询的序列号,表示查询执行select字句或操作表的顺序

id相同,执行顺序从上到下
id不同,值越大,先执行

select_type

表示select类型
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)

(2) PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

(3) UNION(UNION中的第二个或后面的SELECT语句)

(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)

(5) UNION RESULT(UNION的结果)

(6) SUBQUERY(子查询中的第一个SELECT)

(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询)

(8) DERIVED(派生表的SELECT, FROM子句的子查询)

(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

table

查询的表名

type

表示msyql在表中找到所需行的方法,也叫访问类型

  • all: 全表扫描,mysql将遍历全表以找到匹配的行

  • index: 遍历索引树

  • range: 检索给定范围的行,使用索引来选择行

  • ref: 表示上述表的匹配连接条件,即哪些列/常量被用于查找索引列上的值

  • eq_ref: 类似ref,区别在使用的索引树唯一索引,对每个索引值,只有一条记录,也就是说多表连接使用primary keyunique key作为关联条件

  • const, system: 当mysql对查询某部分进行优化,并转换为一个常量时使用, 如将主键置于where列表中,mysql就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system

  • null: mysql在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成

possible_keys

mysql能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引被列出,但不一定被查询使用

key

mysql 查询实际使用到的索引

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,不损失精确性

extra

该列包含MySQL解决查询的详细信息,有以下几种情况:

  • Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤

  • Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询

  • Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”

  • Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

  • Impossible where:这个值强调了where语句会导致没有符合条件的行。

  • Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

总结:
• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
• EXPLAIN不考虑各种Cache
• EXPLAIN不能显示MySQL在执行查询时所作的优化工作
• 部分统计信息是估算的,并非精确值
• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

Alt text

标签:语句,UNION,explain,查询,索引,mysql,SELECT
From: https://www.cnblogs.com/erfeng/p/17687796.html

相关文章

  • MySQL面试题
    1、MySQL的复制原理以及流程(1)、复制基本原理流程主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;2.从:io线程——在使用startslave之后,负责从master上拉取binlog内容,放进自己的relaylog中;3.从:sql执行线程——执行relaylog中的语句;(2)、MyS......
  • MySQL group_concat() 函数用法
    MySQLgroup_concat()函数用法在使用groupby对数据进行分组后,如果需要对select的数据项进行字符串拼接,这时就需要用到group_concat()函数。1、基本用法group_concat()完整语法如下:group_concat([DISTINCT]要连接的字段[OrderBY排序字段ASC/DESC][Separator'分......
  • Mac 终端登陆MySQL出现“zsh:command not found: mysql”的问题
    mysql明明安装好了,而且也登陆使用过了,但是这次在终端登陆却报错这个问题。其实上次也报错这个一样的问题,我觉得可能是环境配置没有弄好,重新检查和source生效了下(source~/.bash_profile),此时mysql能正常登陆了;但是退出终端后再次登陆又会报同样的问题。感觉不对劲了,只能生效一次......
  • 用docker搭建mysql的主从复制
    (1)创建主容器dockerrun-d-p3306:3306--privileged=true-v/mysql/log:/var/log/mysql-v/mysql/data:/var/lib/mysql-v/mysql/conf:/etc/mysql/conf.d-eMYSQL_ROOT_PASSWORD=123456--namemysqlmysql:(2)在宿主机/mysql/conf中创建mysql配置文件touch/mysql/conf/my.cnf......
  • mac mysql无法启动
    背景:在mac上装了mysql后无法启动,报错如下: 解决步骤:1.修改mysql配置文件,飘红的为修改部分(/usr/local/etc/my.cnf)#DefaultHomebrewMySQLserverconfig[mysqld]#Onlyallowconnectionsfromlocalhostbind-address=127.0.0.1#mysqlx-bind-address=127.0.0.1   #......
  • 2 Mysql环境安装与配置
    下载Mysql安装与配置Mysql启动与停止Mysql启动用管理员身份打开cmd,输入以下指令netstart服务名停止在cmd中,输入以下指令netstop服务名登录与退出Mysql服务器登录语法:mysql-uroot[-h服务器ip]-p[密码]修改密码语法:setpasswordforroot@localh......
  • MySQL查询语句汇总附练习带注释(二)
    数据库查询语句包含条件查询语法:SELECT*/列名FROM表名WHERE条件ORDERBY列名1ASC/DESC,列名2ASC/DESC;--条件可以包含关系运算符、逻辑运算符、特殊情况等--是--在几个选项之中--betweenand在一定范围内--要求查询emp表中员工编号大于等于50的员工编号SELEC......
  • mysql8关闭binlog并清空Binlog
    编辑my.ini或者my.cnf文件清空binlog信息#查看现存的binlog文件列表showmasterlogs;#重置清空binlog文件resetmaster;#重置清空后重新查看现存的binlog文件列表是否都被清空了showmasterlogs;停用binlog功能为啥要关闭binlog功能呢?是因为反正是个测试服务器,......
  • mysql8 Found option without preceding group错误
    这个错误说起来是真的坑,今晚帮同学在window操作系统上安装mysql8当自定义my.ini文件的时候就出现一下错误,死活启动不起来一直报错。当删掉这个my.ini文件的时候却能启动,刚开始以为是my.ini里的配置选项不对,一个一个筛查后依然不行。最后发现尽然是my.ini文件格式编码不对。改为A......
  • MyBatis操作Oracle(实现兼容Oracle和MySQL)
    MyBatis操作Oracle(实现兼容Oracle和MySQL)以Oracle11g来演示,只需要创建序列,不需要创建触发器,通过ORM框架操作来生成主键MySQL版本是8.x代码地址:https://gitee.com/zhang-zhixi/springboot-mp-oracle-auto.git1、分别创建Student表Oracle:CREATETABLE"STUDENT"("ID"N......