网站首页 > java教程 正文
MySQL 之 Explain 输出分析
背景
前面的文章写过 MySQL 的事务和锁,这篇文章我们来聊聊 MySQL 的 Explain,估计大家在工作或者面试中多多少少都会接触过这个。可能工作中实际使用的不多,但是不论的自己学习还是面试,都需要掌握的。
Explain 可以使用在SELECT, DELETE, INSERT, REPLACE, and UPDATE 语句中,执行的结果会在每一行显示用到的每一个表的详细信息。简单语句可能结果就只有一行,但是复杂的查询语句会有很多行数据。
Explain 的使用
在 SQL 语句前面加上 explain,如:EXPLAIN SELECT * FROM a;
举个例子
CREATE TABLE `a` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `uid` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_uid` (`uid`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
采用上面的语句EXPLAIN SELECT * FROM a;
效果如下
通过图片我们可以看到执行过后会输出 12 个字段,那么每个字段是什么意思呢?我们来一一看下
Explain 输出的字段内容
id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows,filtered,extra
列名含义id查询语句的标识select_type查询的类型table当前行所查的表partitions匹配的分区type访问类型possible_keys查询可能用到的索引keymysql 决定采用的索引来优化查询key_len索引 key 的长度ref显示了之前的表在key列记录的索引中查找值所用的列或常量rows查询扫描的行数,预估值,不一定准确filtered查询的表行占表的百分比extra额外的查询辅助信息
常用字段详细介绍
1.id: 是用来顺序标识整个查询中 select 语句的,在嵌套查询中id越大的语句越先执行
2.select_type:
?simple: 简单的SELECT(不使用UNION或子查询)
?primary: 最外面的SELECT
?union: UNION中的第二个或更高的SELECT语句
?dependent union: UNION中的第二个或更高的SELECT语句,取决于外部查询
?union result: UNION的结果
?subquery: 在子查询中首先选择SELECT
?dependent subquery: 子查询中的第一个SELECT,取决于外部查询
?derived: 派生表——该临时表是从子查询派生出来的,位于from中的子查询
?uncacheable subquery: 无法缓存结果的子查询,必须为外部查询的每一行重新计算
?uncacheable union: 在UNION中的第二个或更晚的选择属于不可缓存的子查询
3.table: 每一行引用的表名
4.type: 从上到下效果依次降低
?system: const 的一种特例,表中只有一行数据
?const: 当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。使用主键查询往往就是 const 级别的,非常高效
?eq_ref: 最多只返回一条符合条件的记录,通过使用在两个表有关联字段的时候
?ref: 通过普通索引查询匹配的很多行时的类型
?fulltext: 全文索引
?ref_or_null: 跟 ref 类似的效果,不过多一个列不能 null 的条件
?index_merge: 此连接类型表示使用了索引合并优化。在这种情况下,输出行中的 key 列包含使用的索引列表,key_len包含所用索引的最长 key 部分列表
?unique_subquery: 在使用 in 查询的情况下会取代 eq_ref
?range: 范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range
?index: 类似全表扫描,只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多
?ALL: 全表扫描
5.possible_key: MySQL 可能采用的索引,但是并不一定使用
6.key: MySQL 正真使用的索引名称
7.rows: 预估的扫描行数,只能参考不准确
8.extra: 该列包含了很多额外的信息,包括是否文件排序,是否有临时表等,很多时候这个字段很有用能提供很多信息
小结
今天简单的给大家介绍了一些 Explain 的输出信息,很多时候我们可能在平时很少接触,但是很多时候我们还是要掌握的。有些东西该记还得记,该背还得背,毕竟这个社会就是比的谁知道的多。
猜你喜欢
- 2024-11-03 初识java—(五十)输出流(java的输出)
- 2024-11-03 问题:Java的输入输出流包括 【10】 、字符流、文件流、对象流以
- 2024-11-03 JAVA中如何用字节输入输出流实现文件复制 有配图 有源码
- 2024-11-03 Java continue语句详解分享~(java的continue)
- 2024-11-03 Java 控制台输入输出操作记录(java如何从控制台输入一个数)
- 2024-11-03 零基础学 python(三)(完全零基础学python)
- 2024-11-03 《极简Java新手编程之道》6.4.2 continue语句
- 2024-11-03 Python3 输入和输出(python输入与输出)
- 2024-11-03 Java异常处理中throw与throws关键字的用法及区别
- 2024-11-03 java必考面试题:下面程序的输出是什么?
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)