小米正式開(kāi)源 SQL 智能優(yōu)化與改寫(xiě)工具 SOAR
近日,小米正式宣布開(kāi)源 SOAR。

截至今日,該項(xiàng)目已經(jīng)獲得了 350 個(gè)「star」以及 44 個(gè)「fork」(GitHub項(xiàng)目地址:https://github.com/XiaoMi/soar)
SOAR 簡(jiǎn)介
SOAR,即 SQL Optimizer And Rewriter,是一款 SQL 智能優(yōu)化與改寫(xiě)工具,由小米運(yùn)維 DBA 團(tuán)隊(duì)出品
SOAR 體系架構(gòu)

SOAR主要由語(yǔ)法解析器,集成環(huán)境,優(yōu)化建議,重寫(xiě)邏輯,工具集五大模塊組成。
語(yǔ)法解析和語(yǔ)法檢查
一條SQL從文件,標(biāo)準(zhǔn)輸入或命令行參數(shù)等形式傳遞給SOAR后首先進(jìn)入語(yǔ)法解析器,選用了vitess的語(yǔ)法解析庫(kù)作為SOAR的語(yǔ)法解析庫(kù),但隨時(shí)需求的不斷增加我們發(fā)現(xiàn)有些復(fù)雜需求使用vitess的語(yǔ)法解析實(shí)現(xiàn)起來(lái)比較邏輯比較復(fù)雜。于是參考業(yè)辦其他數(shù)據(jù)庫(kù)產(chǎn)品,于是引入了TiDB的語(yǔ)法解析器做為補(bǔ)充。后來(lái)發(fā)現(xiàn)這兩個(gè)解析庫(kù)還存在一定的盲區(qū),于是又引入了MySQL執(zhí)行返回結(jié)果作為多多版本SQL方言的補(bǔ)充。大家也可以看到在語(yǔ)法解析器這里,SOAR的實(shí)現(xiàn)方案是松散的、可插拔的。SOAR并不直接維護(hù)龐大的語(yǔ)法解析庫(kù),它把各種優(yōu)秀的語(yǔ)法解析庫(kù)集成在一起,各取所長(zhǎng)。
集成環(huán)境
集成環(huán)境區(qū)分線上環(huán)境和測(cè)試環(huán)境兩種,分別用于解決不同場(chǎng)景下用戶的SQL優(yōu)化需求。一種常見(jiàn)的情況是已有表結(jié)構(gòu)需要優(yōu)化查詢SQL的場(chǎng)景,可以從線上環(huán)境導(dǎo)出表結(jié)構(gòu)和足夠的采樣數(shù)據(jù)到測(cè)試環(huán)境,在測(cè)試環(huán)境上就可以放心的執(zhí)行各種高危操作而不用擔(dān)心數(shù)據(jù)被損壞。另一種常見(jiàn)的情況是建一套全新的數(shù)據(jù)庫(kù),需要驗(yàn)證提供的數(shù)據(jù)字典中是否存在優(yōu)化的可能。對(duì)于這種情況,很有可能你不需要知道線上環(huán)境在哪兒,完全只是想先試試看,如果報(bào)錯(cuò)了馬上改對(duì)就是了。當(dāng)然還有更多種組合的場(chǎng)景需求,將在集成環(huán)境一單分類說(shuō)明。
優(yōu)化建議
目前SOAR可以提供的優(yōu)化建議有基于啟發(fā)式規(guī)則(通常也稱之為經(jīng)驗(yàn))的優(yōu)化建議,基于索引優(yōu)化算法給出的索引優(yōu)化建議,以及基于EXPLAIN信息給出的解讀。
重寫(xiě)邏輯
上面提到的優(yōu)化建議是早期實(shí)現(xiàn)的主要功能,早期的功能還只是停留在建議上,對(duì)于一些初級(jí)用戶看到建議也不一定會(huì)改寫(xiě)。為了進(jìn)一步簡(jiǎn)化SQL優(yōu)化的成本,SOAR又進(jìn)一步挖掘了自動(dòng)SQL重寫(xiě)的功能?,F(xiàn)在提供幾十種常見(jiàn)場(chǎng)景下的SQL等價(jià)轉(zhuǎn)寫(xiě),不過(guò)相比SQL優(yōu)化建議還有很大的改進(jìn)空間。這部分的功能和邏輯將在重寫(xiě)邏輯一章中詳細(xì)說(shuō)明。
工具集
除了SQL優(yōu)化和改寫(xiě)以外,為了方便用戶使用以及美化輸出展現(xiàn)形式,SOAR還提供了一些輔助的小工具,比如markdown轉(zhuǎn)HTML工具,SQL格式化輸出工具等等。你可以在常用命令中找到這些小工具的使用方法。
SOAR 功能特點(diǎn)
SOAR的功能特點(diǎn)如下:
● 跨平臺(tái)支持(支持Linux, Mac環(huán)境,Windows環(huán)境理論上也支持,不過(guò)未全面測(cè)試)
● 支持基于啟發(fā)式算法的語(yǔ)句優(yōu)化
● 支持復(fù)雜查詢的多列索引優(yōu)化(UPDATE, INSERT, DELETE, SELECT)
● 支持EXPLAIN信息豐富解讀
● 支持SQL指紋、壓縮和美化
● 支持同一張表多條ALTER請(qǐng)求合并
● 支持自定義規(guī)則的SQL改寫(xiě)
此外,小米的SOAR與業(yè)內(nèi)其他優(yōu)秀產(chǎn)品對(duì)比,也有著非常大的優(yōu)勢(shì):

- 分析Mysql表讀寫(xiě)、索引等操作的sql語(yǔ)句效率優(yōu)化問(wèn)題
- MySQL服務(wù)器 IO 100%的分析與優(yōu)化方案
- Mysql優(yōu)化order by語(yǔ)句的方法詳解
- MYSQL配置參數(shù)優(yōu)化詳解
- MySQL中聚合函數(shù)count的使用和性能優(yōu)化技巧
- Mysql查詢最近一條記錄的sql語(yǔ)句(優(yōu)化篇)
- 30個(gè)mysql千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢優(yōu)化技巧詳解
- PHP+MySQL實(shí)現(xiàn)對(duì)一段時(shí)間內(nèi)每天數(shù)據(jù)統(tǒng)計(jì)優(yōu)化操作實(shí)例
- SQL語(yǔ)句優(yōu)化之JOIN和LEFT JOIN 和 RIGHT JOIN語(yǔ)句的優(yōu)化
- 數(shù)據(jù)庫(kù)sql語(yǔ)句優(yōu)化
相關(guān)文章
union組合結(jié)果集時(shí)的order問(wèn)題
如果能確定各查詢結(jié)果不會(huì)有重復(fù)的項(xiàng),最好就帶上all,因?yàn)檫@樣還是可以提高一些效率的。2009-09-09
mssql 30萬(wàn)條數(shù)據(jù) 搜索文本字段的各種方式對(duì)比
30萬(wàn)條,有ID列但無(wú)主鍵,在要搜索的“分類”字段上建有非聚集索引2010-04-04
SQL Server中Check約束的學(xué)習(xí)教程
這篇文章主要介紹了SQL Server中Check約束的學(xué)習(xí)教程,包括對(duì)啟用Check約束來(lái)提升性能的介紹,需要的朋友可以參考下2015-12-12
mybatis動(dòng)態(tài)sql實(shí)現(xiàn)邏輯代碼詳解
mybatis通過(guò)將sql配置xml文件中,通過(guò)解析xml動(dòng)態(tài)標(biāo)簽來(lái)實(shí)現(xiàn)動(dòng)態(tài)sql,本文以xml文件為例給大家介紹mybatis動(dòng)態(tài)sql的實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧2021-08-08
Sql Server 2016新功能之Row-Level Security(值得關(guān)注)
Sql Server 2016 有一個(gè)新功能叫 Row-Level Security 。下面通過(guò)實(shí)例給大家介紹Sql Server 2016新功能之Row-Level Security,感興趣的朋友一起看看吧2016-11-11
sqlserver bcp(數(shù)據(jù)導(dǎo)入導(dǎo)出工具)一般用法與命令詳解
bcp是SQL Server中負(fù)責(zé)導(dǎo)入導(dǎo)出數(shù)據(jù)的一個(gè)命令行工具,它是基于DB-Library的,并且能以并行的方式高效地導(dǎo)入導(dǎo)出大批量的數(shù)據(jù)2012-07-07

