【发布时间】: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 下可用的内容。我从来没有说过你可以得到与甲骨文完全一样的东西。是否使用它取决于您。