MySQL学习——执行计划

  MySQL中可以通过explain关键字模拟优化器执行SQL语句,从而知道MySQL是如何处理SQL语句的,这将有利我们做代码的优化。

1、MySQL查询执行过程

  • 客户端向MySQL服务器发送一条查询请求
  • 服务器首先检查查询缓存,若缓存中存在,则立刻返回存储在缓存中的结果。否则进入下一阶段
  • 服务器进行SQL解析、预处理、再由优化器生成对应的执行计划
  • MySQL根据执行计划,调用存储引擎的API来执行查询
  • 将结果返回给客户端,同时缓存查询结果

2、启动执行计划

EXPLAIN SELECT 投影列 FROM 表名 WHERE 条件 

3、EXPLAIN 列的解释

  我们执行上述语句之后,会得到如下结果,下面我们将来解释每一个字段代表的含义。

  3.1、ID

  查询的执行顺序:

  • id值相同时从上向下执行。
  • id值相同的视为同一组。
  • 如果是子查询,id值会递增,id值越高则有限制越高。

 3.2、select_type

SIMPLE:表示当前查询中不包含子查询或者UNION

PRIMARY:当查询中包含任何复杂的子部分,最外层的查询被标记成primary

DERIVED:在from中包含的子查询被标记为derived

SUBQUERY:在select或者where中包含了子查询,则子查询被标记为subquery

UNION:两个select查询时前一个标记为PRIMARY,后一个标记为UNION。union出现在from子查询中,则外层select标记位PRIMARY,union的第一个查询标价为DERIVED

UNION RESULT:从union表获取结果的select被标记为union result

 3.3、table

  显示这一行的数据时关于那张表的,如果这个表在查询中给了别名,则这里显示的就是表的别名。

 3.4、partitions

  如果MySQL中做了分区了,则会表示数据来源于那个分区。

 3.5、type

  这是非常重要的一列,表示了当前的连接使用了那种类型(消耗的代价),从查询效率从最好到最差的连接类型是:system > const > eq_ref > ref > range > index > ALL。

  • system :表中只有一行数据。属于const的特例。如果物理表中就只有一行数据则这里会显示ALL。
  • const :查询结果最多有一个匹配行。因为只有一行所以被视为常量。const查询速度非常快,因为只读一次,一般情况下把主键或唯一索引作为唯一条件的查询时会是const。
  • eq_ref :查询时查询外键表全部数据。且只能查询主键列或关联列。且外键表中外键列中数据不能有重复数据,这些数据都必须在主键表中有对应数据(主键表中数据可以有 没有用到的)
  • ref :相比eq_ref,不对外键列有强制要求,即:外键列中数据可以重复,只要出现重复的数据取值就是ref。也可能时索引查询。
  • range :把这个列当作条件只检索其中一个范围。常见where子句中出现between、<、in等操作时会出现。主要应用在具有索引的列中才会出现。
  • index :这个连接类型对前边的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表的数据),相当于扫描了索引树。
  • ALL:这个连接类型对于前面的每一个记录联合惊醒完全扫描,一般是比较糟糕的需要避免。

 3.6、possible_keys

  查询条件字段涉及到的索引名。

 3.7、key

  实际使用的索引,如果是NULL,则没有使用索引。

 3.8、key_len

  表示索引中使用的字节数,查询中使用的索引长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len时根据表定义计算而得的,不是通过表内检索出的。

 3.9、ref

  显示索引的那一列被使用了,一般在组合索引中那些被使用

 3.10、rows

  根据表统计信息以及索引选用情况,大致估算出找到所需的记录所需要读取的行数。

 3.11、filtered

  显示了通过条件过滤出的行数的百分比估计值。

 3.12、extra

  MySQL如何解析查询的额外信息。常见的包括:Distinct,Not exists,Using index....等等等,如果见到可以搜索下

 

posted @ 2022-09-21 15:38  Circle_Wang  阅读(93)  评论(0编辑  收藏  举报