一、簡介
1.1 SOAR
SOAR 是一個對 SQL 進行優化和改寫的自動化工具。 由小米人工智能與雲平台的資料庫團隊開發與維護。
下載下傳位址:
https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64
1.1.1 功能特點
- 跨平台支援(支援 Linux, Mac 環境,Windows 環境理論上也支援,不過未全面測試)
- 目前隻支援 MySQL 文法族協定的 SQL 優化
- 支援基于啟發式算法的語句優化
- 支援複雜查詢的多列索引優化(UPDATE, INSERT, DELETE, SELECT)
- 支援 EXPLAIN 資訊豐富解讀
- 支援 SQL 指紋、壓縮和美化
- 支援同一張表多條 ALTER 請求合并
- 支援自定義規則的 SQL 改寫
1.1.2 産品對比

1.2 SOAR-WEB
基于小米 soar 的開源 sql 分析與優化的 web 圖形化工具,支援 soar 配置的添加、修改、複制,多配置切換,配置的導出、導入與導入功能。
下載下傳位址:
https://codeload.github.com/xiyangxixian/soar-web/zip/master
二、基本使用
2.1 SOAR
2.1.1 體系結構
2.1.2 配置檔案說明
配置檔案為
yaml格式。一般情況下隻需要配置online-dsn, test-dsn, log-output等少數幾個參數。即使不建立配置檔案SOAR仍然會給出基本的啟發式建議。
預設檔案會按照
/etc/soar.yaml
,
./etc/soar.yaml
./soar.yaml
順序加載,找到第一個後不再繼續加載後面的配置檔案。如需指定其他配置檔案可以通過
-config
參數指定。
關于資料庫權限
online-dsn
需要相應庫表的SELECT權限,
test-dsn
需要root最高權限。
# 線上環境配置
online-dsn:
addr: 127.0.0.1:3306
schema: sakila
user: root
password: 1t'sB1g3rt
disable: false
# 測試環境配置
test-dsn:
addr: 127.0.0.1:3307
schema: test
user: root
password: 1t'sB1g3rt
disable: false
# 是否允許測試環境與線上環境配置相同
allow-online-as-test: true
# 是否清理測試時産生的臨時檔案
drop-test-temporary: true
# 文法檢查小工具
only-syntax-check: false
sampling-statistic-target: 100
sampling: false
# 日志級别,[0:Emergency, 1:Alert, 2:Critical, 3:Error, 4:Warning, 5:Notice, 6:Informational, 7:Debug]
log-level: 7
log-output: ${your_log_dir}/soar.log
# 優化建議輸出格式
report-type: markdown
ignore-rules:
- ""
# 黑名單中的 SQL 将不會給評審意見。一行一條 SQL,可以是正則也可以是指紋,填寫指紋時注意問号需要加反斜線轉義。
blacklist: ${your_config_dir}/soar.blacklist
# 啟發式算法相關配置
max-join-table-count: 5
max-group-by-cols-count: 5
max-distinct-count: 5
max-index-cols-count: 5
max-total-rows: 9999999
spaghetti-query-length: 2048
allow-drop-index: false
# EXPLAIN相關配置
explain-sql-report-type: pretty
explain-type: extended
explain-format: traditional
explain-warn-select-type:
- ""
explain-warn-access-type:
- ALL
explain-max-keys: 3
explain-min-keys: 0
explain-max-rows: 10000
explain-warn-extra:
- ""
explain-max-filtered: 100
explain-warn-scalability:
- O(n)
query: ""
list-heuristic-rules: false
list-test-sqls: false
verbose: true
2.1.3 指令行參數
幾乎所有配置檔案中指定的參數都通通過指令行參數進行修改,且指令行參數優先級較配置檔案優先級高。
soar -h
2.1.4 啟動
wget https://github.com/XiaoMi/soar/releases/download/0.9.0/soar.linux-amd64 -O soar
chmod a+x soar
開發調試
如下指令如果您沒有精力參與SOAR的開發可以跳過。
make deps 依賴檢查
make vitess 更新Vitess Parser依賴
make tidb 更新TiDB Parser依賴
make fmt 代碼格式化,統一風格
make lint 代碼品質檢查
make docker 啟動一個MySQL測試容器,可用于測試依賴中繼資料檢查的功能或不同版本MySQL差異
make test 運作所有的測試用例
make cover 代碼測試覆寫度檢查
make doc 自動生成指令行參數中-list-XX相關文檔
make daily 每日建構,時刻跟進Vitess, TiDB依賴變化
make release 生成Linux, Windows, Mac釋出版本
安裝驗證
echo 'select * from film' | ./soar
2.1.5 常用指令
vi soar.yaml
# yaml format config file
online-dsn:
addr: 127.0.0.1:3306
schema: sakila
user: root
password: "1t'sB1g3rt"
disable: false
test-dsn:
addr: 127.0.0.1:3306
schema: sakila
user: root
password: "1t'sB1g3rt"
disable: false
echo "select title from sakila.film" | ./soar -test-dsn="root:1t'[email protected]:3306/sakila" -allow-online-as-test -log-output=soar.log
列印所有的啟發式規則
soar -list-heuristic-rules
忽略某些規則
soar -ignore-rules "ALI.001,IDX.*"
列印支援的報告格式
soar -list-report-types
以指定格式輸出報告
soar -report-type json
文法檢查工具
echo "select * from tb" | soar -only-syntax-check
echo $?
0
echo "select * frm tb" | soar -only-syntax-check
At SQL 1 : syntax error at position 13 near 'frm'
echo $?
1
慢日志進行分析示例
pt-query-digest slow.log > slow.log.digest
# parse pt-query-digest's output which example script
python2.7 doc/example/digest_pt.py slow.log.digest > slow.md
SQL指紋
echo "select * from film where col='abc'" | soar -report-type=fingerprint
輸出
select * from film where col=?
将 UPDATE/DELETE/INSERT 文法轉為 SELECT
echo "update film set title = 'abc'" | soar -rewrite-rules dml2select,delimiter -report-type rewrite
輸出
select * from film;
合并多條ALTER語句
echo "alter table tb add column a int; alter table tb add column b int;" | soar -report-type rewrite -rewrite-rules mergealter
輸出
ALTER TABLE `tb` add column a int, add column b int ;
SQL美化
echo "select * from tbl where col = 'val'" | ./soar -report-type=pretty
輸出
SELECT
*
FROM
tbl
WHERE
col = 'val';
EXPLAIN資訊分析報告
soar -report-type explain-digest << EOF
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | film | ALL | NULL | NULL | NULL | NULL | 1131 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
EOF
## Explain資訊
| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | *film* | NULL | ALL | NULL | NULL | NULL | NULL | 0 | 0.00% | ️ **O(n)** | |
Explain資訊解讀
SelectType資訊解讀
* **SIMPLE**: 簡單SELECT(不使用UNION或子查詢等).
Type資訊解讀
* ️ **ALL**: 最壞的情況, 從頭到尾全表掃描.
markdown 轉 HTML
通過指定-report-css, -report-javascript, -markdown-extensions, -markdown-html-flags這些參數,你還可以控制HTML的顯示格式。
cat test.md | soar -report-type md2html > test.html
清理測試環境殘餘的臨時庫表
如配置了-drop-test-temporary=false或soar異常中止,-test-dsn中會殘餘以optimizer_為字首的臨時庫表。手工清理這些庫表可以使用如下指令。
注意:為了不影響正在進行的其他SQL評審,-cleanup-test-database中會删除1小時前生成的臨時庫表。
./soar -cleanup-test-database
2.2 SOAR-WEB
2.2.1 環境需求
python3.x
Flask
pymysql
pycryptodome
pip install -r requirement.txt
注:若 Crypto 子產品找不到, 則需要在 python 的依賴庫目錄 Lib\site-packages 中将 crypto 重命名為 Crypto 。
解壓縮( Windows 可略過此步驟):
sudo -y apt-get install unzip 或者 sudo yum -y install unzip
unzip soar-web.zip
cd soar-web-matster
2.2.2 啟動
運作啟動腳本:
Windows: run.bat
Linux or Mac: bash run.sh
守護程序支援:
啟動服務:bash manage.sh start
關閉服務:bash manage.sh stop
重新開機服務:bash manage.sh restart
注:當主機上存在多個 python 版本時, 需更改 run.sh, run.bat, manage.sh 中的 python 版本指定為 3.x 的版本運作。
在浏覽器上輸入 http://IP:5077 進行通路。
如果需要改 IP 位址和端口号, 可在 config.py 中進行修改。
存儲:
所有的配置都是儲存在浏覽器 Local Storage 中的,多人之間使用是互不影響的,自己隻能看到自己的配置,更換浏覽器或者清除浏覽器會造成配置丢失。
資料庫連接配接:
資料庫連接配接成功後,soar 可以通過表結構提供更正确優質的 sql 評估建議, 配置的正确性決定了 soar 的服務品質。
線上線下環境問題:
線上環境作為待 sql 評估環境,soar 在進行 sql 評估時,會根據 sql 語句,從 線上環境的資料庫連接配接執行個體 拷貝資料表到 測試環境的資料庫連接配接執行個體,然後在測試環境下執行 sql 語句進行分析。是以測試環境的資料庫連接配接執行個體需要有最高權限。如果沒有最高權限可能造成一些問題,如果沒有權限可以啟動一個空的 mysql docker 容器作為測試環境。如果僅僅做測試用,可将線上線下環境指定為一樣。
參考文檔
https://github.com/XiaoMi/soar
https://github.com/xiyangxixian/soar-web