新特性解讀 | 針對使用者定製不同格式執行計劃

ITPUB社群發表於2023-02-09

作者:楊濤濤

資深資料庫專家,專研 MySQL 十餘年。擅長 MySQL、PostgreSQL、MongoDB 等開源資料庫相關的備份恢復、SQL 調優、監控運維、高可用架構設計等。目前任職於愛可生,為各大運營商及銀行金融企業提供 MySQL 相關技術支援、MySQL 相關課程培訓等工作。

本文來源:原創投稿

* 愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


記得以前在專案現場時,客戶曾提出一個這樣的需求:在 MySQL 資料庫裡檢視語句的執行計劃,能否針對不同的使用者使用同樣的語句定製輸出不同的格式?比如使用者張三不想執行 explain format='tree' ,只想簡單執行 explain就可以輸出tree 格式的執行計劃;同樣使用者李四也不想執行 explain format='json' ,只想簡單執行 explain就可以輸出 json 格式的執行計劃。
好吧!當時MySQL 沒有提供這樣的功能,而且我也覺得這樣的功能非必需,於是我給了三個可選方法:
第一:自己寫個指令碼對 MySQL 客戶端進行封裝;
第二:建議直接用 SHELL 來呼叫 MySQL 客戶端,並且定製類似 SHELL 的別名;
第三:別偷懶...。
最後經過一系列探討,客戶選擇了選項三!
不過幸運的是,最新版本 MySQL 8.0.32 最近釋出,提供了這樣的功能。用一個變數來針對不同的使用者可以定製輸出不同格式的執行計劃,變數名為:explain_format 。詳情可以參考官網地址:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
我們來體驗下這個功能:
設定預設格式為 tree 。
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 ,也就是傳統模式。
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' 。

分別建立這兩個使用者:

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

本文關鍵字:#執行計劃輸出格式# #MySQL 8.0 新特性#


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2934536/,如需轉載,請註明出處,否則將追究法律責任。

相關文章