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....等等等,如果见到可以搜索下