- sql语句复杂的话执行计划中能够看到多条语句
- 每个属性代表的含义
- MVCC的深度—->通过锁实现、通过快照、通过时间戳都能来实现
- 执行属性的含义,分析执行过程
-
字段含义
id
id表示执行顺序
- 一个sql语句要进行n多子任务的拆分,所以有顺序要求
- id相同时,从上向下按照顺序执行
- id不同时,id值是按递增顺序显式出来的,id的值越大意味着优先级越高,就越先被执行
- 意义:
- 相同、不同同时存在的时候,id大的先执行,id相同的从上向下执行
- 演示的程序都是在Oracle默认创建的四张表的基础上进行的
- 基础课程中的执行计划在哪里
select_type
- 选择类型的解释不是特别准确
- 主要用来分辨查询的类型,告诉用户是简单查询(普通查询你)、子查询还是联合查询
- 包括simple、union、primary、dependent(衍生)
- 当查询中包含了子查询的时候,会将外层的查询标记为primary
- primary不是表示主键的意思,而只是给了这样一个关键字表示是查询的主体(primary修饰)
- 可以通过select_type得知使用的是一个怎样的查询,是子查询还是关联查询
- 可以体现当前sql语句执行出的一个复杂度
- 所有语句都是simple的话,sql语句就非常简单
table
- 表示查询的表
- 表名
type
- 表示类型
- 本质上是访问方式、访问类型
- 以何种方式去访问数据
- 全盘扫描,直接暴力遍历一张表去查找数据—->效率低下
- 效率从最高到最低分别为:
- system > const > eq_ref> ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
- select * 的类型就是All,是一个全表扫描,效率非常低的类型(效率极低)
- 只要执行计划中出现了All就可以判断sql语句要赶紧进行优化了
- 什么时候不是All?
- 一般写这样的单查询语句都是All—->查询全部数据的语句
- 使用索引的时候不是All
- 没建索引,查询的时候就不会用索引
- mysql中有命令和sql语句两种
- select的是建立了索引的字段时就是index
explain select empno from emp
- index表示全索引扫描,通过索引来把整个数据文件都进行一次扫描—->全部扫描一遍,但是这个扫描不是暴力遍历的,而是用通过索引扫描的
- 如果要select只能用All了,但是用索引的话可以将其优化到index
- index有两种情况:
- 当前查询时覆盖了索引,在索引中就可以获得我们需要的数据
- 使用了索引进行排序,避免了数据的重排序
- index也不是一种最优的方式,在实际开发过程中range是最低要满足的标准
- range表示范围查询—->优化在范围上,原先是在所有数据中查询,而现在是在一个相对原来来说较小的一个范围上查询
- range表示利用索引查询的时候限制了范围,在指定范围内进行查询,这样就避免了index的全索引扫描,适用的操作符:=,<>,>,>=,<,<=,IS NULL, BETWEEN,LIKE, or IN()
- range的效率比index的效率是高很多的,但是要判断什么时候用什么类型的情况
- 最起码要确保当前的查询要达到一个range的级别,最好要达到ref的级别
- ❓ref这个级别的优先级越高,他的效率也就越高,意味着索引使用得越充分!
- 把索引能够充分利用了
- 最好的方式是const,表示表中至多只能有一个匹配行
- 直接根据索引列的值取一行数据就搞定了而不用进行全面扫描(where)
- system表示表中只有一行记录(等于系统表),相当于是const的一个特例,一般情况下平时不会出现
- type列是一个很重要的标准
possible_key
- 创建好一张表之后,这个表中可能不止有一个索引,可能n多个列中都有索引
- 此时执行当前sql语句的时候就可能会用n多个索引
- possible_key表示在执行当前查询计划的时候可能会用到的索引
- 会被列出但不一定会实际使用到
key
- 表示实际应用的索引
key_lens
- 表示索引的长度
- 索引越短越好
- 索引越多、越长占用的存储空间就越大
- 存储空间越大就意味着IO的次数和IO的量就会增加
- 此时在一定程度上能拖垮整个sql语句的执行效率
- key_len也很关键(越小越好)
ref
- 表示索引的哪一列被使用了,如果可能的话,是一个常数值
rows
- 表示执行当前sql语句时可能要查询的sql语句的行数❓
- 只是一个预估值,不一定准确!!!
Extra
- 额外信息
- 分类:
- using filesort:表示进行排序的时候进行的是一个全文件的排序—->使用索引排序就不会出现这个信息,出现这个不太好
- using temporary:表示是否要创建临时表—->作为临时记录,存放中间结果,查询结束后就把临时表删除
- using index:表示当前查询是使用了覆盖索引的,直接从索引中读取数据,而不用访问数据表;同时出现using where时表明索引被用来执行索引键值的查询;如果没有表明索引被用来读取数据,而不是真的查找
- using where:表示使用条件过滤
- using join buffer:表明使用连接缓存
- impossible where:表明当前where语句的结果总是为false