介绍

SOAR(SQL Optimizer And Rewriter)是小米公司开源的一款智能SQL优化与改写工具。它旨在帮助开发人员和DBA自动化地进行SQL质量检查、性能分析和语句改写,从而提升代码质量并降低数据库风险。

核心功能

SOAR具备以下关键能力:

  • 智能SQL优化建议:不仅能指出常见的100多种SQL质量问题,还能为复杂查询提供多列索引优化建议,并支持 UPDATE、INSERT、DELETE、SELECT 等多种语句。

  • 自动SQL改写:提供几十种常见场景下的SQL等价改写功能,能将优化建议直接转化为可执行的SQL语句,进一步简化优化成本。

  • EXPLAIN信息解读:能够自动获取并丰富解读SQL的执行计划(EXPLAIN),协助快速诊断性能瓶颈。

  • 辅助工具集:提供SQL指纹、压缩、美化以及多条ALTER请求合并等辅助功能。

体系架构

SOAR由五大模块构成:

  1. 语法解析器:SOAR本身不维护庞大的解析库,而是集成并组合了Vitess、TiDB等多种优秀的语法解析器,各取所长,实现了灵活的SQL解析能力。

  2. 集成环境:区分线上环境和测试环境。SOAR会将线上表结构同步到测试环境进行分析,从而可以在测试环境安全地执行高危操作,避免影响线上数据。

  3. 优化建议:结合启发式规则(专家经验)、索引优化算法以及EXPLAIN信息解读,生成多维度的优化建议。

  4. 重写逻辑:在提供建议的基础上,实现SQL的自动等价改写,将建议转化为可直接执行的SQL。

  5. 工具集:提供SQL格式化、Markdown转HTML等辅助小工具,方便用户使用和美化输出。

使用场景

SOAR主要适用于以下人群和场景:

  • 负责MySQL性能优化的DBA:用于快速分析和诊断慢查询。

  • 需要批量审查业务SQL的开发者:在代码上线前进行自助式SQL质量检查。

  • 希望建立SQL规范的工程团队:将SOAR集成到CI/CD流程中,作为SQL质量的门禁。

  • 希望对存量SQL做统一梳理的运维人员:对历史遗留SQL进行批量分析和优化。

获取与使用

SOAR是一个跨平台工具,支持Linux、macOS和Windows系统。

  • 开源地址:项目源码托管在GitHub上,采用 Apache License 2.0 开源协议。

  • 快速开始:下载对应平台的二进制文件后,无需复杂配置即可使用。例如,通过管道将SQL语句传递给SOAR,即可生成评审报告。

    echo "select * from tb;" | ./soar
  • Web图形界面:除了命令行工具,社区也提供了Web图形化版本(如 becivells/soar-web),可通过Docker快速部署。

    docker run -d --name soar-web -p 5077:5077 becivells/soar-web

SOAR的核心目标是将DBA的专家经验产品化,帮助开发者在SQL编写阶段就发现问题,防止问题SQL流入生产环境

一,下载

SOAR-WEB下载:GitHub - wjl88lhuc/soar-web: A web UI with soar · GitHub

SOAR下载: SOAR GitHub Releases,下载 soar.windows-amd64

(linux版本要选择对应的下载)

二,配置

在SOAR-WEB创建 Dockerfile文件

# 构建阶段:编译 soar-web
FROM golang:alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
# 使用 vendor 构建,跳过网络下载
COPY . .
RUN go build -mod=vendor -o soar-web .

# 运行阶段:准备最终镜像
FROM alpine

# 安装 glibc 兼容层(使 soar 二进制文件能运行)
RUN apk add --no-cache libc6-compat

WORKDIR /app

# 1. 创建 soar-bin 目录
RUN mkdir -p /app/soar-bin

# 2. 将本地 soar 文件复制到镜像中
COPY soar /app/soar-bin/soar
RUN chmod +x /app/soar-bin/soar

# 3. 复制编译好的 soar-web
COPY --from=builder /app/soar-web .

EXPOSE 5077
CMD ["./soar-web", "--addr", ":5077"]

三,修改

将soar.windows-amd64 修改为 soar

四,运行

执行命令,PowerShell 管理员运行

1. 进入 cd D:\soar\soar-web

2. 构建镜像 docker build --no-cache -t soar-web .

3. 创建容器并后台运行,同时将容器内部的端口映射到外部 docker run -d --name soar-web -p 5077:5077 soar-web

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\Administrator> cd D:\soar\soar-web

PS D:\soar\soar-web> docker build --no-cache -t soar-web .
[+] Building 74.3s (18/18) FINISHED                                                                docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 703B                                                                               0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                   0.1s
 => [internal] load metadata for docker.io/library/golang:alpine                                                   0.1s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => CACHED [stage-1 1/7] FROM docker.io/library/alpine:latest@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86  0.0s
 => => resolve docker.io/library/alpine:latest@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec4349  0.0s
 => [internal] load build context                                                                                  0.1s
 => => transferring context: 107.37kB                                                                              0.1s
 => [builder 1/5] FROM docker.io/library/golang:alpine@sha256:0178a641fbb4858c5f1b48e34bdaabe0350a330a1b1149aabd4  0.0s
 => => resolve docker.io/library/golang:alpine@sha256:0178a641fbb4858c5f1b48e34bdaabe0350a330a1b1149aabd498d0699f  0.0s
 => CACHED [builder 2/5] WORKDIR /app                                                                              0.0s
 => [stage-1 2/7] RUN apk add --no-cache libc6-compat                                                             69.5s
 => [builder 3/5] COPY go.mod go.sum ./                                                                            0.0s
 => [builder 4/5] COPY . .                                                                                         0.6s
 => [builder 5/5] RUN go build -mod=vendor -o soar-web .                                                           7.1s
 => [stage-1 3/7] WORKDIR /app                                                                                     0.5s
 => [stage-1 4/7] RUN mkdir -p /app/soar-bin                                                                       1.0s
 => [stage-1 5/7] COPY soar /app/soar-bin/soar                                                                     0.5s
 => [stage-1 6/7] RUN chmod +x /app/soar-bin/soar                                                                  0.4s
 => [stage-1 7/7] COPY --from=builder /app/soar-web .                                                              0.6s
 => exporting to image                                                                                             1.4s
 => => exporting layers                                                                                            0.9s
 => => exporting manifest sha256:e1ba4f44259030a6ad8c62c521d2c7095ef47d1f7547be83aa070a897ba7722e                  0.1s
 => => exporting config sha256:4dbb8a4678ec0336096f1b544073b2259017532fb7d0a9be563415d838b09e93                    0.0s
 => => exporting attestation manifest sha256:91c56705db9d049500b46fd999df5b12c5e360c0e9ac0c7943c460b60268764a      0.1s
 => => exporting manifest list sha256:6e5ae0f01ec982c58d093811e0cb8f6761de64d8889607d8c433f361eee881bb             0.0s
 => => naming to docker.io/library/soar-web:latest                                                                 0.0s
 => => unpacking to docker.io/library/soar-web:latest                                                              0.4s
WARNING: current commit information was not captured by the build: git was not found in the system: exec: "git.exe": executable file not found in %PATH%

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/eg6mf1bbcukmd7lqa7hpp0tt8

PS D:\soar\soar-web> docker run -d --name soar-web -p 5077:5077 soar-web
76bb01c662c28b7a6c220e12178c7eb50d274172078e6754f86a4500059d8690
PS D:\soar\soar-web>

当然也可以docker 命令行执行也是可以的,随便了

五,访问

访问地址:http://localhost:5077/webui

更多推荐