【问题标题】:Is there a way to show MYsql explain plan like Oracle as a tree有没有办法将 MYsql 解释计划像 Oracle 一样显示为树
【发布时间】:2016-07-18 06:40:34
【问题描述】:

示例查询:

create table t1(c1 int primary key);

MySQL

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

甲骨文:

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2822583898

------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |     1 |    13 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T_DILANG |     1 |    13 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------

Note
-----

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   - dynamic sampling used for this statement (level=2)

12 rows selected.

很多信息可以从tree 像解释计划中得到。如果 MySQL 也能证明这一点,那就太好了。

更新:

使用 Percona Toolkit,pt-visual-explain,效果很好。

命令行输出:

mysql> explain select c1 from t1, A, B where c1 > 0 group by c1 having count(1) > 2 limit 1;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------------------------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                                                     |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------------------------------------+
|  1 | SIMPLE      | t1    | NULL       | index | PRIMARY       | PRIMARY | 4       | NULL |    1 |   100.00 | Using where; Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | A     | NULL       | index | NULL          | idx7    | 4       | NULL |    1 |   100.00 | Using index; Using join buffer (Block Nested Loop)        |
|  1 | SIMPLE      | B     | NULL       | index | NULL          | idx7    | 4       | NULL |    1 |   100.00 | Using index; Using join buffer (Block Nested Loop)        |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------------------------------------+
3 rows in set, 1 warning (0.00 sec)

pt-visual-explain 的输出:

$mysql -e "explain select c1 from t1, A, B where c1 > 0 group by c1 having count(1) > 2 limit 1" | pt-visual-explain
Filesort
+- TEMPORARY
   table          temporary(t1,A,B)
   +- JOIN
      +- Join buffer
      |  +- Index scan
      |     key            B->idx7
      |     key_len        4
      |     rows           1
      +- JOIN
         +- Join buffer
         |  +- Index scan
         |     key            A->idx7
         |     key_len        4
         |     rows           1
         +- Filter with WHERE
            +- Index scan
               key            t1->PRIMARY
               possible_keys  PRIMARY
               key_len        4
               rows           1

【问题讨论】:

  • explain extended 函数?还是第 3 部分 MySQL 分析器?
  • EXPLAIN EXTENDED,还有SET PROFILING = 1; SELECT...; SHOW PROFILE FOR QUERY 1
  • @Mjh @Matt EXPLAIN EXTENDED 没有提供更多信息。 profiling 的方式也不是树状结构。
  • 我刚刚列出了 MySQL 下可用的内容。我从来没有说过你可以得到与甲骨文完全一样的东西。是否使用它取决于您。

标签: mysql oracle explain


【解决方案1】:

新的 MySQL 工作台带有可视化解释计划,它显示了解释查询的流程图。除了在命令行或mysql中,没有太多。

https://dev.mysql.com/doc/workbench/en/wb-performance-explain.html

如果你仍然喜欢命令行,你可以使用 Percona 的 Visual Explain 工具,但它需要解释计划作为给定的输入。

mysql -e "解释从 t1 中选择 c1" | pt-visual-explain

https://www.percona.com/doc/percona-toolkit/2.2/pt-visual-explain.html

【讨论】:

  • 太棒了。我刚刚安装了 Percona Toolkit,它运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多