首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL定制化执行计划的功能

MySQL定制化执行计划的功能

作者头像
bisal
发布2023-02-16 10:05:49
发布2023-02-16 10:05:49
3870
举报

MySQL不同版本,提供了很多新的特性,有些改动可能小,但确实能解决我们的实际问题,例如杨老师的这篇文章《新特性解读 | 针对用户定制不同格式执行计划》,就给我们引入了执行计划的定制化路径。

曾经有客户提出这样的需求:在MySQL数据库里查看语句的执行计划,能否针对不同的用户使用同样的语句定制输出不同的格式?例如用户张三不想执行explain format='tree',只想简单执行explain就可以输出tree格式的执行计划,同样地,用户李四也不想执行explain format='json',只想简单执行explain就可以输出json格式的执行计划。

当时MySQL没有提供这样的功能,但可以提供三个可选方案,
(1)自己写个脚本对MySQL客户端进行封装。
(2)建议直接用SHELL来调用MySQL客户端,并且定制类似SHELL的别名。
(3)别偷懒...。
但是,最新版本MySQL 8.0.32提供了这样的功能。用一个变量来针对不同的用户可以定制输出不同格式的执行计划,变量名为:explain_format。
详情可以参考官网地址:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
我们来体验下这个功能,设置默认格式为tree,
代码语言:javascript
复制
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)
设置默认格式为traditional,也就是传统模式,
代码语言:javascript
复制
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)
有了这个功能,就可以实现本篇开头的需求:语句相同,用户不同,执行计划的输出格式不同。
新建两个用户,一个是zhangsan,另外一个是lisi。
zhangsan的执行计划格式为:explain format='tree'; lisi的执行计划格式为:explain format='json'。

创建这两个用户,

代码语言:javascript
复制
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后,自动设置执行计划格式,

代码语言:javascript
复制
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,

代码语言:javascript
复制
root@ytt-super:/home/ytt# mysql -ulisi --init-command='set @@explain_format=json' -D ytt

此时,就可以实现"语句相同,用户不同,执行计划的输出格式不同"。

有时候,技术上的一个小改动,就可以解决用户操作上的大问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 当时MySQL没有提供这样的功能,但可以提供三个可选方案,
    • (1)自己写个脚本对MySQL客户端进行封装。
    • (2)建议直接用SHELL来调用MySQL客户端,并且定制类似SHELL的别名。
    • (3)别偷懒...。
    • 但是,最新版本MySQL 8.0.32提供了这样的功能。用一个变量来针对不同的用户可以定制输出不同格式的执行计划,变量名为:explain_format。
    • 详情可以参考官网地址:
    • https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
  • 我们来体验下这个功能,设置默认格式为tree,
    • 设置默认格式为traditional,也就是传统模式,
  • 有了这个功能,就可以实现本篇开头的需求:语句相同,用户不同,执行计划的输出格式不同。
  • 新建两个用户,一个是zhangsan,另外一个是lisi。
  • zhangsan的执行计划格式为:explain format='tree'; lisi的执行计划格式为:explain format='json'。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档