【MySQL是怎样运行的 | 第一篇】Explain执行计划上

在这里插入图片描述

1.查询优化-Explain语句详解上

1.1前言

  1. 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 ,这个执行计划展示了接下来具体执行查询的方式,比如可能使用的索引、实际使用的索引、以及使用的索引长度
  2. 可以使用EXPLAIN 语句来帮助我们查看某个查询语句的具体执行计划,例如:
mysql> EXPLAIN SELECT 1;
+----+-------------+-------+------------+------+---------------+------+---------+------+--
----+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | r
ows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--
----+----------+----------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | N
ULL | NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+--
----+----------+----------------+
1 row in set, 1 warning (0.01 sec)
  1. EXPLAIN 语句输出的各个列的作用:

    1. id: 在一个大的查询语句中每个 SELECT 关键字都对应一个唯一的 id
    2. select_type :SELECT 关键字对应的那个查询的类型
    3. table 表名
    4. partitions 匹配的分区信息
    5. type :针对单表的访问方法
    6. possible_keys :可能用到的索引
    7. key :实际上使用的索引
    8. key_len :实际使用到的索引长度
    9. ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息
    10. rows:预估的需要读取的记录条数
    11. filtered:某个表经过搜索条件过滤后剩余记录条数的百分比
    12. Extra 一些额外的信息
  2. 测试表:single_table表

  3. 我们仍然假设有两个和 single_table 表构造一模一样的 s1 、 s2 表,而且这两个表里边儿有10000条记录,除 id列外其余的列都插入随机值

CREATE TABLE single_table (
 id INT NOT NULL AUTO_INCREMENT,
 key1 VARCHAR(100),
 key2 INT,
 key3 VARCHAR(100),
 key_part1 VARCHAR(100),
 key_part2 VARCHAR(100),
 key_part3 VARCHAR(100),
 common_field VARCHAR(100),
 PRIMARY KEY (id),
 KEY idx_key1 (key1),
 UNIQUE KEY idx_key2 (key2),
 KEY idx_key3 (key3),
 KEY idx_key_part(key_part1, key_part2, key_part3)
) Engine=InnoDB CHARSET=utf8;

1.2执行计划输出各列详解

1.2.1 table

  1. 定EXPLAIN语句输出的每条记录都对应着某个单表的访问方法,该条记录的table列代表着该表 的表名

  2. 单表测试:只涉及对 s1 表的单表查询,所以 EXPLAIN 输出中只有一条记录

    mysql> EXPLAIN SELECT * FROM s1;
    +----+-------------+-------+------------+------+---------------+------+---------+------+--
    ----+----------+-------+
    | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | r
    ows | filtered | Extra |
    +----+-------------+-------+------------+------+---------------+------+---------+------+--
    ----+----------+-------+
    | 1 | SIMPLE | s1 | NULL | ALL | NULL | NULL | NULL | NULL | 9
    688 | 100.00 | NULL |
    +----+-------------+-------+------------+------+---------------+------+---------+------+--
    ----+----------+-------+
    1 row in set, 1 warning (0.00 sec)
    
  3. 连接查询:到这个连接查询的执行计划中有两条记录,这两条记录的 table 列分别是 s1 和 s2 ,这两条记录用来分 别说明对 s1 表和 s2 表的访问方法是什么

    mysql> EXPLAIN SELECT * FROM s1 INNER JOIN s2;
    +----+-------------+-------+------------+------+---------------+------+---------+------+--
    ----+----------+---------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | r
    ows | filtered | Extra |
    +----+-------------+-------+------------+------+---------------+------+---------+------+--
    ----+----------+---------------------------------------+
    | 1 | SIMPLE | s1 | NULL | ALL | NULL | NULL | NULL | NULL | 9
    688 | 100.00 | NULL |
    | 1 | SIMPLE | s2 | NULL | ALL | NULL | NULL | NULL | NULL | 9
    954 | 100.00 | Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+--
    ----+----------+---------------------------------------+
    2 rows in set, 1 warning (0.01 sec)
    

1.2.2 id

  1. 查询语句中每出现一个 SELECT 关键字,MySQL 就会为它分配一个唯一的 id 值
mysql> EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';
+----+-------------+-------+------------+------+---------------+----------+---------+-----
--+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref
| rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-----
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来自梦里的一条鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值