概述
SOAR(SQL Optimizer And Rewriter)是一個對SQL進行優化和改寫的自動化工具。 由小米人工智慧與雲平台的資料庫團隊開發與維護。
今天主要介紹下怎麼用SOAR來做一些sql優化的工作。。
一、功能特點
- 跨平台支持(支持Linux, Mac環境,Windows環境理論上也支持,不過未全面測試)
- 目前只支持 MySQL 語法族協議的SQL優化
- 支持基於啟發式算法的語句優化
- 支持複雜查詢的多列索引優化(UPDATE, INSERT, DELETE, SELECT)
- 支持EXPLAIN信息豐富解讀
- 支持SQL指紋、壓縮和美化
- 支持同一張表多條ALTER請求合併
- 支持自定義規則的SQL改寫
二、體系架構
SOAR主要由語法解析器,集成環境,優化建議,重寫邏輯,工具集五大模塊組成。
1、語法解析和語法檢查
一條SQL從文件,標準輸入或命令行參數等形式傳遞給SOAR後首先進入語法解析器,這裡一開始我們選用了vitess的語法解析庫作為SOAR的語法解析庫,但隨時需求的不斷增加我們發現有些複雜需求使用vitess的語法解析實現起來比較邏輯比較複雜。於是參考業務其他資料庫產品,我們引入了TiDB的語法解析器做為補充。我們發現這兩個解析庫還存在一定的盲區,於是又引入了MySQL執行返回結果作為多版本SQL方言的補充。大家也可以看到在語法解析器這裡,SOAR的實現方案是鬆散的、可插拔的。SOAR並不直接維護龐大的語法解析庫,它把各種優秀的語法解析庫集成在一起,各取所長。
2、集成環境
集成環境區分線上環境和測試環境兩種,分別用於解決不同場景下用戶的SQL優化需求。一種常見的情況是已有表結構需要優化查詢SQL的場景,可以從線上環境導出表結構和足夠的採樣數據到測試環境,在測試環境上就可以放心的執行各種高危操作而不用擔心數據被損壞。另一種常見的情況是建一套全新的資料庫,需要驗證提供的數據字典中是否存在優化的可能。對於這種情況,很有可能你不需要知道線上環境在哪兒,完全只是想先試試看,如果報錯了馬上改對就是了。
3、優化建議
目前SOAR可以提供的優化建議有基於啟發式規則(通常也稱之為經驗)的優化建議,基於索引優化算法給出的索引優化建議,以及基於EXPLAIN信息給出的解讀。
4、重寫邏輯
為了進一步簡化SQL優化的成本,SOAR又進一步挖掘了自動SQL重寫的功能。提供幾十種常見場景下的SQL等價轉寫,不過相比SQL優化建議還有很大的改進空間。
5、工具集
除了SQL優化和改寫以外,為了方便用戶使用以及美化輸出展現形式,SOAR還提供了一些輔助的小工具,比如markdown轉HTML工具,SQL格式化輸出工具等等。
三、產品對比
四、二進位安裝部署篇
1、二進位部署
wget https://github.com/XiaoMi/soar/releases/download/0.9.0/soar.linux-amd64 -O soarchmod a+x soar
2、用法
2.1、基本用法
echo "select title from sakila.film" | ./soar -log-output=soar.log
2.2、指定輸入源
# 從文件讀取SQL./soar -query file.sql
2.3、 從管道讀取SQL
cat file.sql | ./soar
2.4、指定配置文件
vi soar.yaml# yaml format config fileonline-dsn: addr: 127.0.0.1:3306 schema: sakila user: root password: "1t'sB1g3rt" disable: falsetest-dsn: addr: 127.0.0.1:3306 schema: sakila user: root password: "1t'sB1g3rt" disable: falseecho "select title from sakila.film" | ./soar -test-dsn="root:1t'[email protected]:3306/sakila" -allow-online-as-test -log-output=soar.log
3、實例
--sql[root@ZL-FSL-TMS-MYSQL1 soar]# cat query.sql select * from fsl_order_base_line where order_base in (select id from (SELECT t2.shipper,t2.dest_dock_code,t1.order_no2,t1.supplier,COUNT(0) cnt,max(t1.id) id FROM fsl_order_base t1 JOIN fsl_order_base_line t2 ON t1.id = t2.order_base WHERE t1.project_code = 'DD' and order_status=0 GROUP BY t2.shipper , t2.dest_dock_code , t1.order_no2 , t1.supplier HAVING COUNT(0) >= 2) a)--配置[root@ZL-FSL-TMS-MYSQL1 soar]# cat soar.yaml # yaml format config fileonline-dsn: addr: 127.0.0.1:3306 schema: xx user: root password: "password" disable: false--優化./soar -query query.sql -online-dsn="root:[email protected]:3306/xxx" -allow-online-as-test -log-output=soar.log
到這裡關於soar的基本操作就介紹完了,那麼有沒有一種基於soar開發的web圖形化工具呢?篇幅有限,後面再做一下介紹,感興趣的朋友可以關注下~