MySQL不同版本,提供了很多新的特性,有些改动可能小,但确实能解决我们的实际问题,例如杨老师的这篇文章《新特性解读 | 针对用户定制不同格式执行计划》,就给我们引入了执行计划的定制化路径。
曾经有客户提出这样的需求:在MySQL数据库里查看语句的执行计划,能否针对不同的用户使用同样的语句定制输出不同的格式?例如用户张三不想执行explain format='tree',只想简单执行explain就可以输出tree格式的执行计划,同样地,用户李四也不想执行explain format='json',只想简单执行explain就可以输出json格式的执行计划。
mysql:8.0.32-cluster:ytt>set @@explain_format=tree;
Query OK, 0 rows affected (0.00 sec)
<mysql:8.0.32-cluster:ytt>explain table t1\G
*************************** 1. row ***************************
EXPLAIN: -> Table scan on t1 (cost=1.20 rows=2)
1 row in set (0.00 sec)mysql:8.0.32-cluster:ytt>set @@explain_format=traditional;
Query OK, 0 rows affected (0.00 sec)
<mysql:8.0.32-cluster:ytt>explain table t1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 2
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)创建这两个用户,
mysql:8.0.32-cluster:ytt>create user zhangsan;
Query OK, 0 rows affected (0.00 sec)
<mysql:8.0.32-cluster:ytt>create user lisi;
Query OK, 0 rows affected (0.01 sec)
<mysql:8.0.32-cluster:ytt>grant select on ytt.* to zhangsan;
Query OK, 0 rows affected (0.01 sec)
<mysql:8.0.32-cluster:ytt>grant select on ytt.* to lisi;
Query OK, 0 rows affected (0.01 sec)用户zhangsan连接MySQL后,自动设置执行计划格式,
root@ytt-super:/home/ytt# mysql -uzhangsan --init-command='set @@explain_format=tree' -D ytt
...
<mysql:8.0.32-cluster:ytt>explain table t1\G
*************************** 1. row ***************************
EXPLAIN: -> Table scan on t1 (cost=1.20 rows=2)
1 row in set (0.00 sec)同样的方法,用户lisi则这样连接MySQL,
root@ytt-super:/home/ytt# mysql -ulisi --init-command='set @@explain_format=json' -D ytt此时,就可以实现"语句相同,用户不同,执行计划的输出格式不同"。
有时候,技术上的一个小改动,就可以解决用户操作上的大问题。