今天给大家分享一个小技巧吧,在MySQL数据库里,使用explain命令,查看的SQL执行计划都是以表格方式展示,有时候看起来觉得不够直观。
例如:
[root@localhost] 20:23:52 [t_db]>explain SELECT * FROM ( SELECT * FROM sbtest1 UNION SELECT * FROM sbtest1 ORDER BY c DESC) t LIMIT 1;
+----+--------------+------------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------+------------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------+
| 1 | PRIMARY | <derived2> | NULL | ALL | NULL | NULL | NULL | NULL | 9762228 | 100.00 | NULL |
| 2 | DERIVED | sbtest1 | NULL | ALL | NULL | NULL | NULL | NULL | 4881114 | 100.00 | NULL |
| 3 | UNION | sbtest1 | NULL | ALL | NULL | NULL | NULL | NULL | 4881114 | 100.00 | NULL |
| NULL | UNION RESULT | <union2,3> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary; Using filesort |
+----+--------------+------------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------+
4 rows in set, 1 warning (0.00 sec)
这个执行计划,如果不太熟悉的同学,可能就不太知道,SQL执行的时候,到底是先使用临时表呢,还是先文件排序。但是如果用树形展示,就非常直观明了。
[root@localhost] 20:24:02 [t_db]>pager pt-visual-explain
PAGER set to 'pt-visual-explain'
[root@localhost] 20:24:27 [t_db]>explain SELECT * FROM ( SELECT * FROM sbtest1 UNION SELECT * FROM sbtest1 ORDER BY c DESC) t LIMIT 1;
Table scan
rows 9762228
+- DERIVED
table derived(temporary(union(sbtest1,sbtest1)))
+- Table scan
+- TEMPORARY
table temporary(union(sbtest1,sbtest1))
+- Filesort
+- Table scan
+- UNION
table union(sbtest1,sbtest1)
+- Table scan
| rows 4881114
| +- Table
| table sbtest1
+- Table scan
rows 4881114
+- Table
table sbtest1
4 rows in set, 1 warning (0.00 sec)
树形展示,看起来就非常直观,从下往上看,SQL如何执行的一目了然。
如何取消树形展示呢,非常简单,只需要执行下面的命令即可。
[root@localhost] 20:25:45 [t_db]>pager
Default pager wasn't set, using stdout.