• 查询计划参考


    一、官方:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

    二、语句:

    explain select * from tableName;

    • id:执行的顺序,数值大的优先执行
    • select_type:查询类型,方式
      select_type 值JSON名称含义
      SIMPLE 没有 简单SELECT(不使用 UNION或子查询)
      PRIMARY 没有 最外层 SELECT
      UNION 没有 第二个或之后的SELECT陈述 UNION
      DEPENDENT UNION dependenttrue 中的第二个或更高版本的SELECT语句 UNION,取决于外部查询
      UNION RESULT union_result 的结果UNION
      SUBQUERY 没有 首先SELECT在子查询
      DEPENDENT SUBQUERY dependenttrue 首先SELECT在子查询中,取决于外部查询
      DERIVED 没有 派生表
      DEPENDENT DERIVED dependenttrue 派生表依赖于另一个表
      MATERIALIZED materialized_from_subquery 物化子查询
      UNCACHEABLE SUBQUERY cacheablefalse 子查询,其结果无法缓存,必须针对外部查询的每一行重新进行评估
      UNCACHEABLE UNION cacheablefalse UNION 属于不可缓存子查询的中的第二个或更高版本的选择(请参阅参考资料 UNCACHEABLE SUBQUERY
    • table:表名
    • partitions:查询将从中匹配记录的分区。该值适用NULL于未分区的表
    • type(注意我下面写的描述是根据我实际测试的结果写的,不是完全参照官网):参考https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-join-types
      • system:该表只有一行(=系统表),const的一个特例,
      • const:唯一键的=条件基本上都是这个
      • eq_ref:关联子查询中有一个执行计划命中eq_ref
      • ref:命中的是一个普通索引(非唯一键)
      • fulltext:参考https://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html,先建立一个全文索引,再利用相应的函数进行查询
      • ref_or_null:与ref不同的是增加一个or条件is null
      • index_merge:这个比较容易,就是一个where or的条件语句,前后都是命中索引的
      • unique_subquery:搞了半天也是没搞出来,官方语句:value IN (SELECT primary_key FROM single_table WHERE some_expr)
      • index_subquery:类似于unique_subquery,适用于子查询中的非唯一键插叙,弄了好几种尝试,愣是没搞出来,先贴个官方的:value IN (SELECT key_column FROM single_table WHERE some_expr)
      • range:范围查询,
        • =    等于
        • <>      不等于
        • >        大于
        • >=      大于等于
        • <    小于
        • <=      小于等于
        • IS NULL 是否为空
        • <=>  <=> NULL 相当于 IS NULL
        • BETWEEN  介于起止两个点之间,包含
        • LIKE  不加通配符的情况下,也相当于=
        • IN   在指定集合的范围内 
      • index
        • Extra:use Index:查询索引字段,这种情况下只扫描索引树,理论上更快
        • Extra:空;例子:order by 索引字段,查询涵没有索引的字段,只是根据索引树顺序来查询数据,实际上还要从表中读取数据,所以速度理论上应该比上面那种慢
      • all:最慢,全表
    • possible_keys:可能用到的索引
    • key:实际用到的索引
    • key_len:key长度,字节
    • ref:ref列显示将哪些列或常量与该key列中命名的索引进行比较,以 从表中选择行(一般显示const或者外键关联的字段)
    • row:预估的记录数量
    • filtered:filtered列指示将被表条件过滤的表行的估计百分比。最大值为100,表示没有行过滤发生。值从100减小表示过滤量增加。 rows显示检查的估计行数,rows× filtered显示将与下表连接的行数。例如,如果 rows为1000且 filtered为50.00(50%),则与下表连接的行数为1000×50%= 500。
    • Extra:参考https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-extra-information (太多了,实在不想写,具体意义一般是参照其他列看,常见的应该是Use Where、Using index)
  • 相关阅读:
    计算两个日期之间相差的年数月数天数(JS实现)
    一次源码编译PHP折腾记
    Spring的JdbcTemplate与其事务
    spring aop的配置
    动态代理的几种方式
    移动互联网后端技术
    web front end stack web 前段技术概览
    BIO | NIO | AIO (Java版)
    什么是javascript中的闭包?
    get、put、post、delete含义与区别
  • 原文地址:https://www.cnblogs.com/gabin/p/13707022.html
Copyright © 2020-2023  润新知