共计 2322 个字符,预计需要花费 6 分钟才能阅读完成。
这篇文章主要介绍了 MySQL 执行计划的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
执行计划是什么?
执行计划,简单的来说,是 SQL 在数据库中执行时的表现情况, 通常用于 SQL 性能分析, 优化等场景。
一. 执行计划能告诉我们什么?
SQL 如何使用索引
联接查询的执行顺序
查询扫描的数据函数
二. 执行计划中的内容
SQL 执行计划的输出可能为多行,每一行代表对一个数据库对象的操作
1. ID 列
ID 列中的如果数据为一组数字,表示执行 SELECT 语句的顺序;如果为 NULL,则说明这一行数据是由另外两个 SQL 语句进行 UNION 操作后产生的结果集
ID 值相同时,说明 SQL 执行顺序是按照显示的从上至下执行的
ID 值不同时,ID 值越大代表优先级越高,则越先被执行
演示
可以看到上面的执行计划返回了 3 行结果,id 列的值可以看作是 SQL 中所具有的 SELECT 操作的序号
由于上述 SQL 中只有一个 SELECT,所以 id 全为 1,因此,我们就要按照由上至下读取执行计划
按照我们的 SQL 语句,我们会认为执行顺序是 a,b,c, 但是通过上图可以发现,Mysql 并不是完成按照 SQL 中所写的顺序来进行表的关联操作的
执行对表的执行顺序为 a,c,b,这是由于 MySQL 优化器会根据表中的索引的统计信息来调整表关联的实际顺序
2. SELECT_TYPE 列
值含义 SIMPLE 不包含子查询或是 UNION 操作的查询 PRIMARY 查询中如果包含任何子查询,那么最外层的查询则被标记为 PRIMARYSUBQUERYSELECT 列表中的子查询 DEPENDENT SUBQUERY 依赖外部结果的子查询 UNIONUnion 操作的第二个或是之后的查询的值为 unionDEPENDENT UNION 当 UNION 作为子查询时,第二或是第二个后的查询的 select_type 值 UNION RESULTUNION 产生的结果集 DERIVED 出现在 FROM 子句中的子查询
3. TABLE 列
包含以下几种结果:
输出去数据行所在表的名称,如果表取了别名,则显示的是别名
union M,N:由 ID 为 M,N 查询 union 产生的结果集
derived N / subquery N:由 ID 为 N 的查询产生的结果
4. PARTITIONS 列:
查询匹配的记录来自哪一个分区
对于分区表,显示查询的分区 ID
对于非分区表,显示为 NULL
5. TYPE 列
按性能从高至低排列如下:
值含义 system 这是 const 联接类型的一个特例,当查询的表只有一行时使用 const 表中有且只有一个匹配的行时使用,如对主键或是唯一索引的查询,这是效率最高的联接方式 eq_ref 唯一索引或主键索引查询,对应每个索引键,表中只有一条记录与之匹配 ref 非唯一索引查找,返回匹配某个单独值的所有行 ref_or_null 类似于 ref 类型的查询,但是附加了对 NULL 值列的查询 index_merge 该联接类型表示使用了索引合并优化方法 range 索引范围扫描,常见于 between、、这样的查询条件 indexFULL index Scan 全索引扫描,同 ALL 的区别是,遍历的是索引树 ALLFULL TABLE Scan 全表扫描,这是效率最差的联接方式
6. Extra 列
包含 MySQL 如何执行查询的附加信息
值含义 Distinct 优化 distinct 操作,在找到第一个匹配的元素后即停止查找 Not exists 使用 not exists 来优化查询 Using filesort 使用额外操作进行排序,通常会出现在 order by 或 group by 查询中 Using index 使用了覆盖索引进行查询 Using temporaryMySQL 需要使用临时表来处理查询,常见于排序,子查询,和分组查询 Using where 需要在 MySQL 服务器层使用 WHERE 条件来过滤数据 select tables optimized away 直接通过索引来获得数据,不用访问表,这种情况通常效率是最高的
7. POSSIBLE_KEYS 列
指出 MySQL 能使用哪些索引来优化查询
查询列所涉及到的列上的索引都会被列出,但不一定会被使用
8. KEY 列
查询优化器优化查询实际所使用的索引
如果表中没有可用的索引,则显示为 NULL
如果查询使用了覆盖索引,则该索引仅出现在 Key 列中
9. KEY_LEN 列
显示 MySQL 索引所使用的字节数,在联合索引中如果有 3 列,假如 3 列字段总长度为 100 个字节,Key_len 显示的可能会小于 100 字节,比如 30 字节,这就说明在查询过程中没有使用到联合索引的所有列,只是利用到了前面的一列或 2 列
表示索引字段的最大可能长度
Key_len 的长度由字段定义计算而来,并非数据的实际长度
10. Ref 列
表示当前表在利用 Key 列记录中的索引进行查询时所用到的列或常量
11. rows 列
表示 MySQL 通过索引的统计信息,估算出来的所需读取的行数(关联查询时,显示的是每次嵌套查询时所需要的行数)
Rows 值的大小是个统计抽样结果,并不十分准确
12. Filtered 列
表示返回结果的行数占需读取行数的百分比
Filtered 列的值越大越好(值越大,表明实际读取的行数与所需要返回的行数越接近)
Filtered 列的值依赖统计信息,所以同样也不是十分准确,只是一个参考值
三. 执行计划的限制
无法展示存储过程,触发器,UDF 对查询的影响
无法使用 EXPLAIN 对存储过程进行分析
早期版本的 MySQL 只支持对 SELECT 语句进行分析
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“MySQL 执行计划的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!