跳至主要內容

MySql-执行计划

HFwas约 849 字大约 3 分钟

MySql-执行计划

MySql 给我们提供了 explain 命令来分析 Sql 语句的性能,

分析步骤

获取需要分析执行计划的 Sql 语句,加 expalin 命令,格式explain sql语句,会得到以下的结果:

mysql> explain select * from users; 
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key          | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | users | NULL       | index | NULL          | idx_username | 259     | NULL |    1 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> 

explain 返回的结果有12列,分别是:

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra

explain 结果

id

  • 在一个大的查询语句种每个 select 关键字都对应一个唯一的 id
  • 连接查询的执行计划当中,每个表都会对应一条记录,这些记录的 id 值是一样的,出现在前边的是驱动表,后边的是被驱动表

select_type

  • select 关键字对应的那个关键字对应的类型
描述
SIMPLE简单的 SELECT 语句(不包括 UNION 操作或子查询操作)
PRIMARY查询中最外层的 SELECT(如两表做 UNION 或者存在子查询的外层的表操作为 PRIMARY,内层的操作为 UNION
UNIONUNION 操作中,查询中处于内层的 SELECT,即被 union 的 SELECT
SUBQUERY子查询中的 SELECT
DERIVED表示包含在 From 子句中的 Select 查询
UNION RESULTunion 的结果,此时 id 为 NULL

table

  • 涉及的表名称

partitions

  • 匹配的分区信息

type

  • 针对单表的访问方法
描述
system表只有一行,MyISAM 引擎所有
const常量连接,表最多只有一行匹配,通常用于主键或者唯一二级索引列与常数惊醒等值匹配时
eq_ref表关联查询时,对于前表的每一行,后表只有一行与之匹配。(1) join查询(2) 命中主键或者非空唯一索引
ref只使用了索引的最左前缀或者使用的索引是非唯一索引、非主键索引
rangebetween,in,>等都是典型的范围(range)查询
index需要扫描索引上的全部数据
all全表扫描

possible_keys

  • 可能用到的索引方法

key

  • 实际上使用的索引

key_len

  • 实际上使用的索引长度

ref

  • 当使用索引列等值查询时,与索引列进行等值匹配的对象信息

rows

  • 结果集的行数

filtered

  • 某个表经过搜索条件过滤后剩余记录条数的百分比

Extra

  • 一些额外的信息
描述
Using indexselect后面的查询字段在索引中就可以取到,无需再回表了,即所谓的覆盖索引,这种查询性能很好
Using filesort当order by 无法利用索引完成排序时,优化器不得不选择合适的算法从内存或者磁盘进行排序
Using temporary使用了临时表
Using index conditionmysql5.6之后引入了ICP(索引条件下推)
Using whereMysql 服务器在存储引擎检索行后再进行过滤

工具

MySql 5.6 之后的版本给用户提供了一个 optimizer_trace 的功能,可以让我们能够方便的查看 mysql 优化器生成执行计划的整个过程

执行show variables like 'optimizer_trace';查看可以查看功能的状态:

Snipaste_2025-05-13_20-43-37
Snipaste_2025-05-13_20-43-37

one_line 值是控制格式的,如果为 on 所有数据都会在一行中展示

可以执行SET optimizer_trace="enabled=on";打开 optimizer_trace 功能

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3