1. sql语句复杂的话执行计划中能够看到多条语句
  2. 每个属性代表的含义
  3. MVCC的深度—->通过锁实现、通过快照、通过时间戳都能来实现
  4. 执行属性的含义,分析执行过程
  5. 看到执行计划之后该如何进行优化,每个属性都有要求

    字段含义

    id

  6. id表示执行顺序

  7. 一个sql语句要进行n多子任务的拆分,所以有顺序要求
  8. id相同时,从上向下按照顺序执行
  9. id不同时,id值是按递增顺序显式出来的,id的值越大意味着优先级越高,就越先被执行
  10. 意义:
  11. 相同、不同同时存在的时候,id大的先执行,id相同的从上向下执行
  12. 演示的程序都是在Oracle默认创建的四张表的基础上进行的
  13. 基础课程中的执行计划在哪里

select_type

  1. 选择类型的解释不是特别准确
  2. 主要用来分辨查询的类型,告诉用户是简单查询(普通查询你)、子查询还是联合查询
  3. 包括simple、union、primary、dependent(衍生)
  4. 当查询中包含了子查询的时候,会将外层的查询标记为primary
  5. primary不是表示主键的意思,而只是给了这样一个关键字表示是查询的主体(primary修饰)
  6. 可以通过select_type得知使用的是一个怎样的查询,是子查询还是关联查询
  7. 可以体现当前sql语句执行出的一个复杂度
  8. 所有语句都是simple的话,sql语句就非常简单

table

  1. 表示查询的表
  2. 表名

type

  1. 表示类型
  2. 本质上是访问方式、访问类型
  3. 以何种方式去访问数据
    1. 全盘扫描,直接暴力遍历一张表去查找数据—->效率低下
    2. 效率从最高到最低分别为:
      1. system > const > eq_ref> ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
    3. select * 的类型就是All,是一个全表扫描,效率非常低的类型(效率极低)
  4. 只要执行计划中出现了All就可以判断sql语句要赶紧进行优化了
  5. 什么时候不是All?
    1. 一般写这样的单查询语句都是All—->查询全部数据的语句
    2. 使用索引的时候不是All
  6. 没建索引,查询的时候就不会用索引
  7. mysql中有命令和sql语句两种
  8. select的是建立了索引的字段时就是indexexplain select empno from emp
  9. index表示全索引扫描,通过索引来把整个数据文件都进行一次扫描—->全部扫描一遍,但是这个扫描不是暴力遍历的,而是用通过索引扫描的
  10. 如果要select只能用All了,但是用索引的话可以将其优化到index
  11. index有两种情况:
    1. 当前查询时覆盖了索引,在索引中就可以获得我们需要的数据
    2. 使用了索引进行排序,避免了数据的重排序
  12. index也不是一种最优的方式,在实际开发过程中range是最低要满足的标准
  13. range表示范围查询—->优化在范围上,原先是在所有数据中查询,而现在是在一个相对原来来说较小的一个范围上查询
  14. range表示利用索引查询的时候限制了范围,在指定范围内进行查询,这样就避免了index的全索引扫描,适用的操作符:=,<>,>,>=,<,<=,IS NULL, BETWEEN,LIKE, or IN()
  15. range的效率比index的效率是高很多的,但是要判断什么时候用什么类型的情况
  16. 最起码要确保当前的查询要达到一个range的级别,最好要达到ref的级别
  17. ❓ref这个级别的优先级越高,他的效率也就越高,意味着索引使用得越充分!
  18. 把索引能够充分利用了
  19. 最好的方式是const,表示表中至多只能有一个匹配行
  20. 直接根据索引列的值取一行数据就搞定了而不用进行全面扫描(where)
  21. system表示表中只有一行记录(等于系统表),相当于是const的一个特例,一般情况下平时不会出现
  22. type列是一个很重要的标准

possible_key

  1. 创建好一张表之后,这个表中可能不止有一个索引,可能n多个列中都有索引
  2. 此时执行当前sql语句的时候就可能会用n多个索引
  3. possible_key表示在执行当前查询计划的时候可能会用到的索引
  4. 会被列出但不一定会实际使用到

key

  1. 表示实际应用的索引

key_lens

  1. 表示索引的长度
  2. 索引越短越好
  3. 索引越多、越长占用的存储空间就越大
  4. 存储空间越大就意味着IO的次数和IO的量就会增加
  5. 此时在一定程度上能拖垮整个sql语句的执行效率
  6. key_len也很关键(越小越好)

ref

  1. 表示索引的哪一列被使用了,如果可能的话,是一个常数值

rows

  1. 表示执行当前sql语句时可能要查询的sql语句的行数❓
  2. 只是一个预估值,不一定准确!!!

Extra

  1. 额外信息
  2. 分类:
    1. using filesort:表示进行排序的时候进行的是一个全文件的排序—->使用索引排序就不会出现这个信息,出现这个不太好
    2. using temporary:表示是否要创建临时表—->作为临时记录,存放中间结果,查询结束后就把临时表删除
    3. using index:表示当前查询是使用了覆盖索引的,直接从索引中读取数据,而不用访问数据表;同时出现using where时表明索引被用来执行索引键值的查询;如果没有表明索引被用来读取数据,而不是真的查找
    4. using where:表示使用条件过滤
    5. using join buffer:表明使用连接缓存
    6. impossible where:表明当前where语句的结果总是为false

image.png

基础课中详细讲过执行计划!