今天給大家分享一個小技巧吧,在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.