Skip to content

mysql的执行计划

MySQL 的执行计划(Explain Plan)是一个非常重要的工具,用于分析和优化 SQL 查询的性能。通过查看执行计划,我们可以了解 MySQL 是如何执行一个查询的,包括它选择使用哪些索引、连接类型、排序方法等。这对于找出查询性能瓶颈和进行相应的优化至关重要。

如何查看执行计划

在 MySQL 中,你可以通过在 SQL 查询前加上 EXPLAINEXPLAIN EXTENDED 关键字来查看其执行计划。EXPLAIN EXTENDED 会提供更多信息,包括未优化前的一些步骤,但这些额外的信息需要通过 SHOW WARNINGS 来查看。

示例:

sql EXPLAIN SELECT * FROM your_table WHERE your_column = 'some_value';
或者
sql EXPLAIN EXTENDED SELECT * FROM your_table WHERE your_column = 'some_value'; SHOW WARNINGS; -- 查看 EXTENDED 产生的额外信息

执行计划中的关键列

  • 执行计划的结果包含多列,每列都提供了关于查询执行过程的重要信息。以下是一些关键的列:
    • id: 查询的标识符。如果查询包含子查询,MySQL 会为它们分配一个唯一的标识符。
    • select_type: 查询的类型(如 SIMPLE 表示简单的 SELECT,不使用 UNION 或子查询;PRIMARY 表示查询中最外层的 SELECT;SUBQUERY 表示子查询中的第一个 SELECT)。
    • table: 输出行所引用的表。
    • partitions: 匹配的分区。
    • type: 连接类型,表示 MySQL 如何找到所需的行。常见类型包括 ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、ref(使用非唯一性索引或唯一性索引的前缀来查找单个行)、eq_ref(对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的连接类型,除了 const 类型)。
    • possible_keys: 显示可能应用在这张表上的索引,但不一定被查询实际使用。
    • key: 实际使用的索引。如果没有选择索引,则为 NULL。
    • key_len: 使用的索引的长度。在不损失精确性的情况下,长度越短越好。
    • ref: 显示索引的哪一列或常数被用于查找值。
    • rows: MySQL 认为必须检查的用来返回请求数据的行数。
    • filtered: 表示返回结果的行占开始找到的行(rows列的值)的百分比。
    • Extra: 包含不适合在其他列中显示但十分重要的额外信息。

优化建议

  • 减少 rows 的值:优化查询以减少需要检查的行数。
  • 优化索引:确保查询中使用的列上有索引,并且索引是有效的。
  • 避免全表扫描:尽量让查询能够利用索引。
  • 优化连接类型:尽量使用高效的连接类型,如 ref 或 eq_ref。
  • 注意 type 列:观察连接类型,并尝试通过优化查询或索引来改善它们。