MySQL explain 中列的取值及含义讲解

 更新时间:2023年03月21日 09:22:15   作者:Ch.yang  
这篇文章主要介绍了MySQL explain 中列的取值及含义,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言

今天看 《MySQL 是怎样允许的》和 《高性能MySQL》索引相关的部分,觉得有必要整理下 explain 中列的取值及含义。以后工作的时候翻阅查找更快。

type

type 取值含义
const使用主键 或 唯一二级索引
eq_ref被驱动表,用主键 或 唯一二级索引进行 (索引列不为空)
ref普通 的二级索引进行等值匹配 (索引列不为空)
ref_or_null普通 的二级索引进行等值匹配 (索引可以为空)
index_mergeTODO 索引合并相关的内容待探索
unique_subquery查询优化器把 in 语句优化成 exists,使用了主键 或 唯一二级索引进行 (索引列不为空)
index_subquery查询优化器把 in 语句优化成 exists,使用了普通索引
range范围扫描
index1. 使用索引覆盖, 但是要扫描全部的索引记录 where条件只命中部分索引
2. 全表扫描, 并且要对主键进行排序
all全表扫描

ref

表示等值匹配用的是什么

ref 取值含义相关列
const与key列的索引名等值匹配key
表的列名与该列进行等值匹配
func函数

rows

预计扫描的行数

filtered

是一个百分比数,key1 扫描的数作为分母, common_field 命中的结果为分子

select * from s1 where key1 > 'z' and common_field = 'a'

表关联的时候,这个指标比较重要,针对下表数据

tablerowsfiltered
s1968810
s21100

extra

extra 取值含义
Using index使用了索引覆盖
Using index condition使用了索引下推
Using where在 server 层进行了判断(没有索引的列)
Using join buffer (Block Nested Loop)不能有效利用索引时,退而求其次使用缓存
Using filesort使用内存或者磁盘进行文件排序
Using temporary使用了临时表

补充: 简单阐述索引下推

client -> server -> 存储引擎,下推的意思是把筛选放到存储引擎,减少回表的数据量

形如 where key1 > xxx and key3 like ‘%a’ ,5.6 版本 like 的操作是在server层处理的,5.7.x的版本后可以在存储引擎层完成过滤。

补充:group by 优化掉额外的排序操作

select common_field, count(*) as amount from s1 group by common_field;
-- 以上语句会被 mysql 补充为
select common_field, count(*) as amount from s1 group by common_field order by common_field;
-- 如果要省略文件排序, 则显式声明为 order by null
select common_field, count(*) as amount from s1 group by common_field order by null;

后记

TODO: 用 otpimzer trace 查询优化器的具体工作过程

到此这篇关于MySQL explain 中列的取值及含义的文章就介绍到这了,更多相关MySQL explain列的取值及含义内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL之DATE_ADD()和DATE_SUB()函数的使用方式

    MySQL之DATE_ADD()和DATE_SUB()函数的使用方式

    这篇文章主要介绍了MySQL之DATE_ADD()和DATE_SUB()函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式

    详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式

    本篇文章主要介绍了buntu Server下启动/停止/重启MySQL数据库的三种方式,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • Mysql+Keepalived实现双主热备方式

    Mysql+Keepalived实现双主热备方式

    这篇文章主要介绍了Mysql+Keepalived实现双主热备方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失

    使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失

    这篇文章主要介绍了使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失的相关资料,需要的朋友可以参考下
    2015-09-09
  • LEFT JOIN关联表中ON,WHERE后面跟条件的区别

    LEFT JOIN关联表中ON,WHERE后面跟条件的区别

    本文主要介绍了LEFT JOIN关联表中ON,WHERE后面跟条件的区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • PHP使用mysqli扩展连接MySQL数据库

    PHP使用mysqli扩展连接MySQL数据库

    这篇文章主要介绍了PHP使用mysqli扩展连接MySQL数据库,需要的朋友可以参考下
    2014-08-08
  • mySQL中in查询与exists查询的区别小结

    mySQL中in查询与exists查询的区别小结

    最近被一个朋友问到mySQL中in查询和exists的区别,当然只是草草的回答了下,今天偶然看到了一篇关于mysql中的exists查询的文章,读完感觉太”冷落”它了,这里总结一下,也跟自己常用的in查询做一下对比。有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2016-11-11
  • MySQL之递归小问题

    MySQL之递归小问题

    这篇文章主要介绍了MySQL之递归小问题,需要的朋友可以参考下
    2017-05-05
  • 一文带你了解MySQL之约束

    一文带你了解MySQL之约束

    在SQL标准中,一共规定了6种不同的约束,包括非空约束,唯一约束和检查约束等,而在MySQL中是不支持检查约束的,所以这篇文章先对其余5种约束做一个详解和练习,需要的朋友可以参考下
    2023-06-06
  • Mysql中批量替换某个字段的部分数据(推荐)

    Mysql中批量替换某个字段的部分数据(推荐)

    这篇文章主要介绍了Mysql中批量替换某个字段的部分数据,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论