soar
XiaoMi/soar加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
"一个 SQL 跑得慢,DBA 加班到凌晨三点——这是很多团队真实的工作写照。而 SOAR 正是小米 DBA 团队为了解决这个问题而开源的自动化工具。"
想象一下这个场景:凌晨两点,线上数据库告警,查询响应时间从毫秒级飙升到几十秒。开发团队紧急排查,定位到某条 SELECT 语句——它用了三年都没问题,偏偏今天数据量过了一个临界点,查询计划变了。更糟糕的是,团队里没人能快速说清楚这条 SQL 到底有什么问题,应该怎么改。
这是 DBA 日常最典型的困境:SQL 质量参差不齐,缺乏标准化审核机制;优化依赖个人经验积累,水平参差不齐;很多团队没有专职 DBA,问题 SQL 直接上生产。 小米作为日活数亿的平台级产品,后端数据库压力可想而知。2017 年前后,小米 DBA 团队决定将内部沉淀多年的 SQL 优化能力开源,SOAR 由此诞生。
SOAR(SQL Optimizer And Rewriter)由小米人工智能与云平台的数据库团队开发,采用 Go 语言编写,核心架构分为五大模块:

语法解析器 是 SOAR 的第一道关卡。团队早期选用了 Vitess 的语法解析库,但在处理某些复杂需求时发现局限性,于是又引入了 TiDB 的解析器作为补充,甚至直接调用 MySQL 执行返回结果来覆盖多版本方言。这套"可插拔"的方案让 SOAR 能兼容 MySQL 各版本的语法细节。
启发式规则引擎 是 SOAR 最核心的模块。数百条经过实战验证的规则被编码为结构体,每条规则包含代号、危险等级、摘要、解释、SQL 示例和建议位置。SQL 经过解析后,逐一经过这些规则检查,命中结果最终合并输出。例如 L0 级别可能是"避免 SELECT *"的警告,而 L8 级别则是"可能导致全表扫描"的严重告警。
索引优化模块 是整个项目技术含量最高的部分。团队阅读了超过五百万字的学术论文和博客,将 DBA 积累的经验转化为可推导的算法,覆盖 UPDATE、INSERT、DELETE、SELECT 等各类语句的多列索引优化。
重写逻辑 则更进一步——不仅给出优化建议,还能自动将 SQL 改写为等价但更高效的版本。目前已支持数十种常见场景的自动等价转写。
工具集 提供了一组辅助能力,包括 markdown 转 HTML、SQL 美化格式化、SQL 指纹生成等实用功能。
SOAR 的功能可以分为三大类:
SQL 审核:输入任意 SQL,SOAR 会输出详细的审核报告。每条建议包含危险等级(0-8 级,数字越大越严重)、问题描述、为什么这是问题,以及具体的优化示例。比如一条 SELECT * FROM orders WHERE YEAR(create_time) = 2024 的 SQL,SOAR 会指出 YEAR() 函数导致索引失效,建议改为 BETWEEN 范围查询。
EXPLAIN 解读:MySQL 的 EXPLAIN 输出对新手不友好,SOAR 能将执行计划中的每个字段翻译成直观的解释,让开发者真正看懂查询计划为什么慢。
自动改写:支持数十种 SQL 的等价转换。例如将子查询转换为 JOIN、将 OR 条件拆分为 UNION、将多条分散的 ALTER 语句合并为一条批量 ALTER。
SOAR 是一个纯命令行工具,下载对应平台的二进制文件即可运行,不需要安装任何运行时依赖。以下是一个典型的使用流程:
# 安装(直接下载二进制)
wget https://github.com/XiaoMi/soar/releases/download/0.9.0/soar.linux-amd64
chmod +x soar.linux-amd64
mv soar.linux-amd64 /usr/local/bin/soar
# 基本使用
echo 'SELECT * FROM orders WHERE YEAR(create_time)=2024;' | soar
# 连接数据库进行完整分析
soar -test-dsn "user:password@tcp(127.0.0.1:3306)/database"
不过需要注意的是:SOAR 目前只支持 MySQL 语法族,不支持 PostgreSQL、SQL Server 等其他数据库。另外,SOAR 没有 Web UI,是纯 CLI 工具,虽然社区有第三方开发者贡献了 soar-web 等可视化前端,但官方只维护核心引擎。
SOAR 的最大价值在于将 DBA 的隐性经验显性化。一条规则背后可能是一位 DBA 花了两小时排查出的教训,SOAR 把这些经验固化为可复用的自动化检查,让初级开发者也能写出高质量的 SQL。
但它也有明显的局限性。首先是只支持 MySQL,与当前多元化数据库生态存在落差。其次,项目自 2023 年 12 月后没有新提交,虽然目前状态仍为"未归档",但维护活跃度已大幅下降。此外,SOAR 无法处理需要结合业务语义才能判断的优化场景。
尽管如此,SOAR 仍被大量国内团队用于 CI/CD 流水线中的 SQL 审核环节,在数据库质量保障体系中扮演着重要角色。截至目前,项目在 GitHub 获得超过 8700 颗星,1318 个 Fork,17 位贡献者参与开发,是小米开源项目中极具代表性的基础设施工具之一。