当前位置: 首页 > news >正文

MySQL的分析查询语句(EXPLAIN):

目录

基本语法:

各个字段的含义:

id:

select_type:

table:

partitions:

type:

possible_keys:

key:

key_len:

ref:

row:

filtered:

extra:


EXPLAIN用于解析SQL语句的执行计划,展示MySQL如何进行查询。

基本语法:

EXPLAIN SELECT 具体的执行语句;

各个字段的含义:

id:

在一个大的查询语句中每一个select关键字都对应一个唯一的id。

需要注意的是:

1.查询优化器可能会对设计子查询的查询语句进行重写,将子查询转换为多表查询的操作。

所以可能id编号和select数不等。如:

explain select * from 表1 where 字段 in (select 字段1 from 表2
where 条件);

2.因为union是要进行去重的,进行去重时是在表1和表2组成的临时表中去重。所以会多一条记录。临时表记录id为NULL。注意union all是不需要去重的,所以不用建立临时表。

3.id相同的话,优先级相同,从上往下顺序执行。id不同的话,id越大优先级越高,就越先执行。

4.每一个id表示一趟独立的查询,sql查询的趟数越少越好。

select_type:

select关键字对应的查询类型。

查询语句中不包含union或者子查询的为"SIMPLE"。

当包含union(union all)或者子查询时,其中外层主查询的查询为"PRIMARY",第二个查询以及之后的查询为"UNION"。

包含union(union all)的查询中,如果小查询都依赖于外层查询,那么除了最左边的小查询之外,其余的都是"DEPENDENT UNION"。

对于union查询去重的,是在临时表上进行的去重,所以针对该临时表为"UNION RESULT"。

对于子查询,如果包含子查询的语句不能转化为多表查询且该子查询不为相关子查询,那么该子查询第一个select关键字代表的查询为"SUBQUERY",但是如果是相关子查询,那么则为"DEPENDENT SUBQUERY"。

对于派生表的查询,该派生表对应的子查询是"DERIVED"。

当查询优化器在致辞那个包含子查询的语句时,将子查询物化之后与外层查询进行连接查询时,该查询为"MATERIALIZED"。

table:

无论查询语句多复杂包含多少个表,都是需要对每一个表进行单表访问的,索引MySQL规定explain语句输出的每条记录都对应着某个单表的访问方法(每一行记录都对应着一个单表),该条记录的table列代表着该表的表名,不一定是真实的表名也可能是实际表、派生表或UNION结果集的临时表。

partitions:

代表分区表中的命中情况,非分区表为NULL,一般情况下都是NULL。

type:

表示数据访问方式,按效率从高到低。

当表中只有一条记录且该表使用的存储引擎的统计数据是精确的,为"system"。

根据主键或者唯一二级索引列与常数进行等值匹配,为"const"。

连接查询时,被驱动表通过主键或者唯一二级索引列等值匹配,为"eq_ref"。

普通二级索引列与常量等值匹配,该索引列的值也可以为NULL时,可能为"ref_or_null"。

包含in子查询的语句中,如果优化器将in子查询转化为exists子查询且可以使用主键进行等值匹配,为"unique_subquery"。

使用索引能够获取范围区间的记录,为"range"。

当使用索引覆盖,但需要扫描全部索引时,为"index"。

全表扫描时,为"all"。

possible_keys:

查询时可能用到的索引,一般涉及到的字段存在索引都会列出,但是不一定使用。

key:

实际查询用到的索引,如果没有使用索引则为NULL。

key_len:

查询中实际使用到的索引长度(字节数)。检查是否充分利用了索引,值越大越好,主要针对于联合索引,判断具体命中了哪些列。

ref:

使用索引列等值查询时,与索引进行等值匹配的对象信息。

row:

预估的需要读取的记录条数,值越小越好,因为读取的数据量越小,I/O次数可能会更少。

filtered:

经过搜索条件过滤后的记录条数占预估读取的记录数的百分比,值越大越好,说明越匹配。

extra:

补充查询时的额外信息。

当查询语句没有from子句时会提示"no table used"。

查询语句where子句永远为false时将会提示"impossible where"。

使用全表扫描来执行对某个表的查询,且该语句中有针对该表的搜索条件(未完全利用索引),会提示"using where"。

当查询列表处有MIN或者MAX聚合函数,但没有符合的where子句的搜索条件的记录时,会提示"no matching min/max row",如果有的话,则提示"select tables optimized away"。

当查询列表以及搜索条件只包含属于某个索引的列,也就是覆盖索引,会提示"using index"。

当使用左(外)连接时,如果where子句中包含要求被驱动的某个列等于null值的搜索条件且不允许存储null值时,会提示"using where; not exists"。

当limit子句的参数为0,提示"zero limit"。

如果查询使用了文件排序的方式执行查询,会提示"using filesort",需要进行优化,为排序字段增加索引。

查询中借助了临时表,则会提示"using temporary",需要优化,最好用索引替代临时表。

http://www.dtcms.com/a/333551.html

相关文章:

  • stream流debug
  • 华硕主板怎样调整风扇转速
  • Redis高级优化实战:从键值设计到集群调优
  • [HDCTF 2023]Normal_Rsa(revenge)
  • 晶振电路的负载电容、电阻参数设计
  • 重新定义城市探索!如何用“城市向导”解锁旅行新体验?
  • PID控制算法
  • Pytest 插件使用指南:让你的测试更高效
  • 中级统计师-会计学基础知识-第一章 账户与复试记账
  • @PreAuthorize(“hasPermission(#resourceId, ‘DATA_ASSET‘, ‘read‘)“)无法识别参数
  • 机器学习案例——《红楼梦》文本分析与关键词提取
  • C语言第八章指针五
  • 国内著名AI搜索优化专家孟庆涛发表《AI搜索内容可信度评估综合指南》
  • AI智能体在软件测试中的应用与未来趋势
  • 快速了解PCA降维
  • exec函数族、线程
  • termios 线程 poll epoll进化 二叉AVL红黑树
  • Redis入门和简介
  • python学习打卡day35
  • 分库分表和sql的进阶用法总结
  • AI客户维护高效解决方案
  • element-plus 如何通过js验证页面的表单
  • 开发避坑指南(27):Vue3中高效安全修改列表元素属性的方法
  • IP地址代理服务避坑指南:如何选择优质的IP地址代理服务公司?
  • 前端设置不同环境高德地图 key 和秘钥(秘钥通过运维统一配置)
  • 六大主流负载均衡算法
  • w484扶贫助农系统设计与实现
  • 【postgresql】一文详解postgresql中的统计模块
  • [Pyro概率编程] 概率分布 | 共轭计算 | 参数存储库
  • Qt开发:实现跨组件的条件触发