天天看點

SOAR 101 快速入門指南

本文介紹了soar可以提供的功能以及一些使用場景,并給出相關用例。

上篇文章回顧:dpdk-lvs的一次線上故障排查報告

soar開源兩周以來,在Github獲得了社群2700+顆星的支援,這期間有很多的開源社群同學參與到soar的成長當中,為我們提供了許多優秀的意見和建議。

SOAR 101 快速入門指南

我們希望能夠有更多的人來感受一下這款“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           

複制