目录

MySQL的Explain

目录
警告
本文最后更新于 2023-02-28,文中内容可能已过时。
1
2
3
4
5
6
EXPLAIN * FROM t WHERE id=0;
+----+-------------+-------+-------+---------------+-----+---------+--------+-------+-----------------------+
| id | select_type | table | type  | possible_keys | key | key_len | ref    | rows  | Extra                 |
+----+-------------+-------+-------+---------------+-----+---------+--------+-------+-----------------------+
| 1  | SIMPLE      | t     | range | a             | a   | 5       | <null> | 10001 | Using index condition |
+----+-------------+-------+-------+---------------+-----+---------+--------+-------+-----------------------+
  • id:表示要解释的查询的id。
  • SELECT_TYPE:这里显示select子句中的复杂程度。
    • SIMPLE:此选项指简单的 SELECT 语句;
    • PRIMARY:此选项指包含完全由 MySQL 优化器执行的 SELECT 语句;
    • SUBQUERY:此选项指子查询,它是一个独立的 SELECT 语句;
    • DEPENDENT SUBQUERY:此选项指依赖于外部查询的子查询;
    • DERIVED:此选项指通过 UNION 或 UNION ALL 合并的相关查询;
    • UNCACHEABLE SUBQUERY:此选项指无法在缓存中找到的子查询。
  • table:这里显示使用的表的名称。
  • Partitions:显示查询中加入的表的分区数。
  • type:表示连接类型。
    • system:系统表或者临时表操作。
    • const:单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。(最好)
    • eq_ref:调用 PRIMARY KEY 匹配具体唯一数据行。
    • ref:指的是使用普通的索引(normal index)。(要求)
    • range:对索引进行范围检索。(至少)
    • all:全表扫描。
  • possible_keys:可能被使用的键。
  • key:被使用的键。
  • key_len:使用的键的长度。
  • ref:在查询中比较列时提及的任何形式的引用或不提及。
  • rows:预计扫描行数。
  • Filtered:使用WHERE子句中的条件过滤的行。
  • Extra:关于执行查询的一些附加信息。
    • Using where:在查询语句中使用了WHERE子句。
    • Range checked for each record (index map: 0x4):使用某种索引的扫描。
    • Using temporary:查询使用了临时表。
    • Using filesort:使用sort_buffer排序扫描来实现排序或分组。
    • Using index:使用了覆盖索引。
    • Using index condition:使用了索引作为条件,有回表操作。
    • Using join buffer (flat, BNL join):执行 Flat Join 或 Block Nested Loop (BNL) Join 这两种类型的 Join 操作。(尽量避免)
      • Flat Join:一次完整的扫描(读取)一个表中所有记录,然后根据条件从另一张表中找到匹配的数据。
      • Block Nested Loop (BNL) Join:将两个表中的元组划分为块,然后对于同一块中的所有元组,进行逐个比较,找到匹配的元组。

Optimizing Queries with EXPLAIN

相关内容