五、执行计划
2019-11-27 16:03:12来源:博客园 阅读 ()
五、执行计划
执行计划
执行计划是什么
执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。
为什么要有执行计划
当我们的系统上线后数据库的记录不断增加,之前写的一些SQL语句或者一些ORM操作效率变得非常低。我们不得不考虑SQL优化。
SQL优化大概是这样一个流程:
1.定位执行效率低的SQL语句(定位);
2.分析为什么这段SQL执行的效率比较低(分析);
3.最后根据第二步分析的结构采取优化措施(解决)。
而EXPLAIN命令的作用就是帮助我们分析SQL的执行情况,属于第二步。说的规范一点就是:EXPLAIN命令是查看查询优化器如何决定执行查询的主要的方法。学会解释EXPLAIN将帮助我们了解SQL优化器是如何工作的。执行计划可以告诉我们SQL如何使用索引,连接查询的执行顺序,查询的数据行数。
如何使用执行计划
要使用EXPLAIN,只需要在查询的SELECT关键字之前增加EXPLAIN这个词。
下面是一个简单EXPLAIN的结果:
解释执行计划中的列
ID列
是一位数字,表示执行SELECT语句的顺序。id值相同执行顺序从上到下。id值不同时id值大的先执行。
SELECT_TYPE列
这一列要是用于区别:普通查询、联合查询、子查询等的复杂查询。取值如下:
Table列
显示这一行的数据是关于哪张表的
Type列
type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:
system > const > eq_ref > ref >
fulltext > ref_or_null > index_merge > unique_subquery >
index_subquery > range > index > ALL
需要记忆的
system>const>eq_ref>ref>range>index>ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。
System与const
System:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计
Const:表示通过索引一次就找到了
const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。
如将主键置于where列表中,MySQL就能将该查询转换为一个常量
eq_ref
唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
ref
非唯一性索引扫描,返回匹配某个单独值的所有行.
本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体
range
只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引
一般就是在你的where语句中出现了between、<、>、in等的查询
这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
index
当查询的结果全为索引列的时候,虽然也是全部扫描,但是只查询的索引库,而没有去查询数据。
all
将搜索全表以找到匹配的行
possible_keys与Key列
possible_keys:可能使用的key
Key:实际使用的索引。如果为NULL,则没有使用索引
查询中若使用了覆盖索引,则该索引和查询的select字段重叠
KEY_LEN列
表示索引字段的最大可能长度,KEY_LEN的长度由字段定义计算而来,并非数据的实际长度。
根据这个值,就可以判断索引的使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用得到。
关于key_len列:
- 变长字段需要额外的2个字节,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明长度超过了255,则使用两个字节)所以VARCHAR索引长度计算时要加2,固定长度的字段不需要额外的字节。
- 如果该列可为NULL,则需要1个字节的额外空间,所以索引字段最好不要为NULL。因为NULL让统计更加复杂并且需要额外的存储空间。
- 复合索引有最左前缀的特性,如果复合索引能全部使用上
REF列
显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。
ROWS列
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。
Extra列
包含不适合在其他列中显示但十分重要的额外信息。
原文链接:https://www.cnblogs.com/lee0527/p/11943778.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Java面试题汇总
- 如何在Spring Boot应用启动之后立刻执行一段逻辑?本文详解 2020-06-05
- 如何在Spring Boot应用启动之后立刻执行一段逻辑 2020-06-02
- Spark SQL源码解析(五)SparkPlan准备和执行阶段 2020-05-27
- Spring MVC必须知道的执行流程 2020-05-23
- 一个java文件是怎么一步一步执行的 2020-05-09
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash