当前位置:网站首页>MySQL(八) — 执行计划(Explain)详解
MySQL(八) — 执行计划(Explain)详解
2022-06-23 06:23:00 【坏蛋呆呆】
目录
执行计划
执行计划的作用
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
执行计划如何使用
explain <sql语句>
如 explain select * from test;
执行计划内容

id
id是select查询的序列号,包含一组数字,表示查询中执行select子语句或操作表的顺序。
三种情况:
1、id相同,执行顺序由上至下。
2、id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。
3、id中相同和不同同时存在。
select_type
select_type是指查询的类型,主要用于区分普通查询、联合查询、子查询等复杂查询。
- SIMPLE:简单的select查询,查询中不包含子查询或者union。
- PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记位PRIMARY。
- SUBQUERY:在select或where列表中包含了子查询。
- DERIVED:在From列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放到临时表中。
UNION:若第二个select出现在union之后,则标记为union;若union包含在from子句的子查询中,外层select则被标记为DERIVED。
- UNION RESULT:从union表获取结果的select。
table
table是显示这一行的数据是关于哪张表的。
type
type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。
- system:表只有一行记录(等于系统表),这是const类型的特例,平时基本不会出现。
- const:表示通过索引一次就找到了。const用于比较primary key或unique索引。因为只匹配一行数据,所以很快。
- eq_ref:唯一性索引扫描,对于每个索引列,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
- ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以它应该属于查找和扫描的结合体。
- range:只检索给定范围的行,使用一个索引来选择行。key列显示使用哪个索引。一般就是在where语句中出现了between、<、>、in等查询。这种索引扫描比全表扫描要好,因为它开始于索引的某一点,结束语另一点,不需要扫描全部索引。
- all:遍历全表。
possible_keys
表示可能会用到的索引。
key
key表示实际使用到的索引。如果为null,则没有使用索引。查询中若使用了覆盖索引,则该索引和查询的select字段重叠。
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
- key_len表示索引使用的字节数。
- 根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用到。
- char和varchar跟字符编码也有密切的联系。
- latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)。
ref
表示哪些列或常量被用于查找索引列上的值;显示索引的哪一列被使用了,如果可能的话,最好是一个常数。
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。
extra
Extra表示包含不适合在其他列中显示但十分重要的额外信息。
- Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。
- Using temporary:使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。
- Using index:是否使用了覆盖索引。
- Using where:表明使用了where过滤。
- Using join buffer:使用了连接缓存。
- Impossible where:where子句的值总是false,不能用来获取任何元组。
边栏推荐
猜你喜欢

初始化层实现

WPF command directive and inotifypropertychanged

产品-Axure9(英文版),原型设计 制作下拉二级菜单

junit单元测试报错org.junit.runners.model.InvalidTestClassError: Invalid test class ‘xxx‘ .No runnable meth

PSP代码实现

Eureka

100 GIS practical application cases (79) - key points of making multi plan integrated base map

Interpreting the spirit of unity and cooperation in maker Education

TP6+Redis+think-queue+Supervisor实现进程常驻消息队列/job任务

Intentional shared lock, intentional exclusive lock and deadlock of MySQL
随机推荐
898. subarray bitwise OR operation
GINet
System permission program cannot access SD card
301. delete invalid brackets
数据库原理实验测试题,关于图书分类表
Swagger3 integrates oauth2 authentication token
EndNote20使用教程分享(未完
redux Actions may not have an undefined “type“ property. Have you misspelled a constant?
正则表达式图文超详细总结不用死记硬背(上篇)
The List
315. calculate the number of elements on the right that are smaller than the current element
MySQL重做日志 redo log
宝塔忘记密码
About professional attitude
312. 戳气球
406 double pointer (27. remove elements, 977. square of ordered array, 15. sum of three numbers, 18. sum of four numbers)
Xxl-sso enables SSO single sign on
如何达到高效的网络信息传播
WPF command directive and inotifypropertychanged
How to migrate virtual machines from VirtualBox to hype-v