本文介紹了soar可以提供的功能以及一些使用場景,并給出相關用例。
上篇文章回顧:dpdk-lvs的一次線上故障排查報告
soar開源兩周以來,在Github獲得了社群2700+顆星的支援,這期間有很多的開源社群同學參與到soar的成長當中,為我們提供了許多優秀的意見和建議。
我們希望能夠有更多的人來感受一下這款“SQL優化神器”能夠帶給你的友善和快捷,這篇文章将會對soar可以提供的功能以及一些使用場景做出介紹,并給出相關用例。
基本用法
1
echo "select title from sakila.film" | ./soar -log-output=soar.log
複制
soar可以通過管道的方式接受傳入的SQL,也可以通過-query的方式來傳入SQL或指定輸入源。使用方式示例如下:
# 從檔案讀取SQL
./soar -query file.sql
# 從管道讀取SQL
cat file.sql | ./soar
複制
在日常使用的時候,如果您是為了快速獲得簡單SQL的評審結果,可以用指令行方式進行傳入。但我們建議使用檔案的方式進行傳入,來避免可能存在的轉義問題。
制定配置檔案
2
在之前的系列文章中我們提到了配置檔案的重要性,配置的正确性決定了soar的服務品質。使用者可以通過以下案例的方式來編輯soar的配置檔案。在不指定配置檔案的情況下,soar預設會從依次檢查/etc/soar.yaml,./etc/soar.yaml以及./soar.yaml這三個路徑,配置檔案優先級依次遞減。
vi soar.yaml
# yaml format config file
online-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: false
複制
如果您需要臨時指定某些變量,可以用指令行參數的形式來指定需要的變量。指令行模式下的配置設定優先級最高。
echo "select title from sakila.film" | ./soar -test-dsn="root:1t'[email protected]:3306/sakila" -allow-online-as-test -log-output=soar.log
複制
但通過指令行的方式輸入配置可能會存在轉義的問題,您也可以使用-config的方式來指定您需要的配置檔案。
echo "select title from sakila.film" | ./soar -config=mysoar.yaml -allow-online-as-test -log-output=soar.log
複制
啟發式規則
3
您可以通過-list-heuristic-rules的方式來檢視目前soar支援的全部啟發式規則建議,預設輸出的是markdown格式的文檔,您可以重定向到一個檔案中進行檢視,soar提供的啟發式建議的相關文檔就是通過這一方式生成的。
$ soar -list-heuristic-rules
複制
忽略某些規則
soar中是可以通過配置-ignore-rules的方式來忽略某些建議的輸出。可以用正則的方式來進行全局比對,也可以指定某個特定的規則item來進行精準屏蔽,多條規則之間用逗号分離。
$ soar -ignore-rules "ALI.001,IDX.*"
複制
豐富的報告格式
4
soar支援多種輸出方式,預設情況下為markdown格式的輸出,您可以根據需要設定您的輸出方式,比如json,比如html等。
$ soar -report-type json
複制
-reprot-type除了可以調整輸出格式,某些特定的功能也是以-report-type的方式來提供的。比如SQL重寫,比如fingerprint等。與檢視啟發式規則一樣,想要檢視soar支援的全部-report-type,可以通過-list-report-types的方式來檢視支援的全部使用方式。
$ soar -list-report-types
複制
快捷的文法檢查工具
5
雖然soar的功能非常豐富,但是在某些特定情況下,比如寫了一條SQL卻并不能肯定文法是否是正确的,那麼可以通過soar提供的文法檢查工具來對SQL文法進行檢查,此時隻會檢查文法的正确性而不會進行一步的評審。
$ echo "select * from tb" | soar -only-syntax-check
$ echo $?0$ echo "select * fromtb" | soar -only-syntax-check
At SQL 0 : syntax error at position 16 near 'fromtb'$ echo $?
1
複制
SQL重寫
6
soar提供了一定的基于抽象文法樹實作的SQL重寫能力。雖然現在這一個功能尚處于研發測試階段,但是某些小的功能已經相對比較完善了,以下舉例幾個簡單地重寫使用場景。
将UPDATE/DELETE/INSERT文法轉為SELECT
在某些情況下,我們需要對非查詢語句進行性能分析,為了保證安全,我們可以先通過soar将這些語句轉化成等價的select語句,在對這些查詢語句進行進一步分析。
$ echo "update film set title = 'abc'" | soar -rewrite-rules dml2select,delimiter -report-type rewrite
複制
輸出
select * from film;
複制
輸入标題合并多條ALTER語句
當線上資料庫環境需要需要進行更新操作時,為了讓某些線上改表工具正确的執行,我們應該将同一張表的多條alter語句合并為一條。soar提供了這樣的功能來友善研發人員或DBA進行合并。
$ 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 ;
複制
EXPLAIN資訊分析報告
7
有時我們擷取到了EXPLAIN資訊,但可能對于MySQL EXPLAIN的内容不熟悉。您可以将mysql輸出的EXPLAIN資訊交給soar,來幫助輔助解讀其中的資訊。這裡傳入的explain可以是普通的表格,也可以是MySQL的JSON格式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
複制
預設輸出結果為markdown格式。
## 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
8
如果您沒有适合的markdown工具,soar也自帶了markdown轉html這樣的功能,盡可能的讓所有人都能感受到soar原生報告的優雅。你還可以通過指定-report-css, -report-javascript, -markdown-extensions, -markdown-html-flags這些參數控制HTML的顯示格式。
$ cat test.md | soar -report-type md2html > test.html
複制
清理測試環境殘餘的臨時庫表
9
如配置了-drop-test-temporary=false或soar異常中止,-test-dsn中會殘餘以optimizer_為字首的臨時庫表。手工清理這些庫表可以使用如下指令。
注意:為了不影響正在進行的其他SQL評審,-cleanup-test-database中會删除1小時前生成的臨時庫表。
./soar -cleanup-test-database
複制