本文介紹了soar能夠提供的功能以及一些使用場景,並給出相關用例。
上篇文章回顧: dpdk-lvs的一次線上故障排查報告
soar開源兩週以來,在Github得到了社區2700+顆星的支持,這期間有不少的開源社區同窗參與到soar的成長當中,爲咱們提供了許多優秀的意見和建議。javascript
咱們但願可以有更多的人來感覺一下這款「SQL優化神器」可以帶給你的方便和快捷,這篇文章將會對soar能夠提供的功能以及一些使用場景作出介紹,並給出相關用例。css
echo "select title from sakila.film" | ./soar -log-output=soar.log複製代碼
soar能夠經過管道的方式接受傳入的SQL,也能夠經過-query的方式來傳入SQL或指定輸入源。使用方式示例以下:html
# 從文件讀取SQL
./soar -query file.sql
# 從管道讀取SQL
cat file.sql | ./soar複製代碼
在平常使用的時候,若是您是爲了快速得到簡單SQL的評審結果,能夠用命令行方式進行傳入。但咱們建議使用文件的方式進行傳入,來避免可能存在的轉義問題。java
在以前的系列文章中咱們提到了配置文件的重要性,配置的正確性決定了soar的服務質量。用戶能夠經過如下案例的方式來編輯soar的配置文件。在不指定配置文件的狀況下,soar默認會從依次檢查/etc/soar.yaml,./etc/soar.yaml以及./soar.yaml這三個路徑,配置文件優先級依次遞減。mysql
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複製代碼
若是您須要臨時指定某些變量,能夠用命令行參數的形式來指定須要的變量。命令行模式下的配置設置優先級最高。sql
echo "select title from sakila.film" | ./soar -test-dsn="root:1t'sB1g3rt@127.0.0.1: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複製代碼
您能夠經過-list-heuristic-rules的方式來查看目前soar支持的所有啓發式規則建議,默認輸出的是markdown格式的文檔,您能夠重定向到一個文件中進行查看,soar提供的啓發式建議的相關文檔就是經過這一方式生成的。json
$ soar -list-heuristic-rules複製代碼
soar中是能夠經過配置-ignore-rules的方式來忽略某些建議的輸出。能夠用正則的方式來進行全局匹配,也能夠指定某個特定的規則item來進行精準屏蔽,多條規則之間用逗號分離。安全
$ soar -ignore-rules "ALI.001,IDX.*"複製代碼
soar支持多種輸出方式,默認狀況下爲markdown格式的輸出,您能夠根據須要設置您的輸出方式,好比json,好比html等。bash
$ soar -report-type json複製代碼
-reprot-type除了能夠調整輸出格式,某些特定的功能也是以-report-type的方式來提供的。好比SQL重寫,好比fingerprint等。與查看啓發式規則同樣,想要查看soar支持的所有-report-type,能夠經過-list-report-types的方式來查看支持的所有使用方式。
$ soar -list-report-types複製代碼
雖然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複製代碼
soar提供了必定的基於抽象語法樹實現的SQL重寫能力。雖然如今這一個功能尚處於研發測試階段,可是某些小的功能已經相對比較完善了,如下舉例幾個簡單地重寫使用場景。
在某些狀況下,咱們須要對非查詢語句進行性能分析,爲了保證安全,咱們能夠先經過soar將這些語句轉化成等價的select語句,在對這些查詢語句進行進一步分析。
$ echo "update film set title = 'abc'" | soar -rewrite-rules dml2select,delimiter -report-type rewrite複製代碼
輸出
select * from film;複製代碼
當線上數據庫環境須要須要進行更新操做時,爲了讓某些在線改表工具正確的執行,咱們應該將同一張表的多條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信息,但可能對於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工具,soar也自帶了markdown轉html這樣的功能,儘量的讓全部人都能感覺到soar原生報告的優雅。你還能夠經過指定-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複製代碼
本文首發於公衆號「小米運維」,點擊查看原文