首页 / 资讯中心 / 文章详情

soar 演进史:从 CHANGES.md 追溯 SQL Optimizer And Rewriter 的核心能力建设

soar 演进史:从 CHANGES.md 追溯 SQL Optimizer And Rewriter 的核心能力建设 ★ FEATURED ARTICLE
开发工具数据库【免费下载链接】soarSQL Optimizer And Rewriter项目地址https://gitcode.com/gh_mirrors/so/soar点击查看免费下载soarSQL Optimizer And Rewriter是一个面向 MySQL 的 SQL 智能优化与改写工具其能力覆盖语法检查、启发式规则评审、索引建议、Explain 解读、SQL 重写与多种报告输出。本文以仓库根目录的 CHANGES.md 变更日志为时间主线逐项还原该工具从 2018 年 3 月架构设计到 2019 年 8 月的完整能力建设历程并结合 advisor/、common/、ast/、database/ 等源码目录印证每一类能力的底层实现。读完本文你将能够按功能域快速定位 soar 的规则体系、索引建议、测试环境与配置机制并理解一个 SQL 优化工具在工程化与开源过程中需要解决的实际问题。一、CHANGES.md 记录了什么一份功能与修复双线并行的演进日志CHANGES.md 覆盖 2018-03 至 2019-08 共 18 个月的开发记录内容可归为四类能力新增如语法检查、数据采样、Explain 解读、启发式规则、报告类型、SQL 重写、配置与日志模块规则修复大量针对具体启发式规则如 ARG.003、CLA.001、ARG.008的边界场景修正底层基础设施替换如 MySQL 驱动从 mymysql 迁移到 go-sql-driver、引入 go.mod、全量 vendor、CI 与测试框架建设开源与社区化2018-09 首次技术分享、2018-10-20 在 OSCAR 对外正式开源发布。从代码结构看这些变更分别落在五个核心模块advisor评审与索引建议、ast基于 Vitess 与 TiDB Parser 的语法树处理、common配置、日志、工具函数、databaseExplain/采样/表结构信息获取、cmd/soar命令行入口。下面按能力域逐层展开。二、奠基期2018-03 ~ 2018-05从架构设计到四大基础能力2.1 基本架构与 AST 底层函数2018-03 完成了基本架构设计并添加大量底层函数用于处理 AST同时实现 Insert、Delete、Update 转写成 Select 的基本函数 与 MySQL Explain 信息输出。这三件事构成了 soar 后续全部能力的地基基于语法树的 SQL 分析见 ast/ 目录下的 token.go、tidb.go、vitess.go将 DML 改写为 SELECT 以便在测试环境安全执行的机制对应重写规则中的dml2select对执行计划的结构化解析见 database/explain.go。2.2 语法检查、测试环境与元数据2018-04 密集落地了语法检查测试环境MySQL 元数据的获取基于数据库环境信息给予索引优化建议不依赖数据库元信息的简单索引优化建议日志模块配置文件七项能力。其中测试环境的设计一直沿用至今配置项中同时存在online-dsn与test-dsn见 common/config.goallow-online-as-test允许在特殊情况下将线上环境直接当作测试环境drop-test-temporary控制是否清理测试环境产生的临时库表。命令行入口 cmd/soar/soar.go 中env.BuildEnv()负责构建测试环境并在程序退出时依据该开关清理临时对象。2.3 数据采样与安全执行2018-052018-05 是能力爆发的一个月新增了数据采样功能通过sampling、sampling-statistic-target对应 PostgreSQL 的default_statistics_target、sampling-condition三个配置项控制common/config.go实现在 database/sampling.go语句执行安全检查评审前判断 SQL 是否具备执行风险DDL 语法检查与 DDL 测试环境执行借助 TiDB Parser 对 DDL 类型语句进行解析与建议隐式数据类型转换检查即后来反复修复的 ARG.003 规则的前身索引去重与前缀索引支持前者演化为独立的duplicate-key-checker报告类型后者体现在索引建议对前缀长度的计算上SQL Pretty 输出即-report-type pretty与compress的底层逻辑。同期还新增SQL 执行超时限制与Explain 支持 last_query_cost前者通过 DSN 的timeout/read-timeout/write-timeoutcommon/config.go实现后者对应show-last-query-cost配置与MaxQueryCost警告阈值。三、启发式规则体系数量扩张与边界修复并重启发式规则是 soar 评审输出的核心。从 advisor/rules.go 可以看到规则按前缀分类ALI别名、ARG参数/谓词、CLA子句、COL列定义、DIS去重、FUN函数、KEY索引键、KWR关键字/命名、LCK锁、LIT字面量、RES结果集、SEC安全、STA标准、TBL表定义。每条规则统一由Rule结构描述包含编号、Severity 级别、摘要、说明文案、示例 SQL 与检测函数。3.1 规则新增CHANGES.md 中明示的五条规则CHANGES.md 明确记录了以下新增规则规则编号关注点规则定义位置advisor/rules.go检测函数实现位置COL.018建表语句中使用不推荐的字段类型默认boolean可用column-not-allow-type配置rules.go#L577-L584heuristic.goRES.009连续判断如col col abc疑似书写错误rules.go#L997-L1004RuleMultiCompareSEC.004发现常见 SQL 注入函数SLEEP、BENCHMARK、GET_LOCK、RELEASE_LOCKrules.go#L1045-L1052RuleInjectionTBL.008表定义相关问题rules.go#L1201—KEY.010全文索引不是银弹需控制查询频率与并发度rules.go#L837-L844RuleFulltextIndexARG.012一次性 INSERT/REPLACE 数据过多rules.go#L272-L279RuleInsertValuesKWR.004不建议使用多字节编码字符中文命名rules.go#L869-L876RuleMultiBytesWord以 SEC.004 为例其Content明确指出SLEEP(), BENCHMARK(), GET_LOCK(), RELEASE_LOCK()等函数常出现在 SQL 注入语句中、会严重影响数据库性能这体现了 soar 的评审不仅是性能优化还包含安全维度同类的还有 SEC.001 TRUNCATE 谨慎使用、SEC.002 密码明文存储检查、SEC.003 高危操作备份提醒。3.2 规则修复反复打磨的边界场景CHANGES.md 中相当篇幅是规则修复记录这些条目恰好勾勒出启发式检查从能检到检得准的过程ARG.003参数比较包含隐式转换无法使用索引是修复次数最多的规则。其规则定义在 rules.go#L200-L207注释明确说明该建议在 IndexAdvisor 中给即真正检测逻辑位于 advisor/index.go 的(*IndexAdvisor).RuleImplicitConversion。修复记录包括INT 与 DECIMAL 类型比较2019-08、使用IN ()运算符时重复建议2019-08、bit 类型未按 int 配置导致误报 ARG.0032018-12、值类型不匹配检查 bug2018-11、字符集与 Collation 不一致时的隐式转换检查2018-07CLA.001最外层 SELECT 未指定 WHERE 条件2019-07 修复 issue #213即SELECT * FROM tbl这类无 WHERE 条件的请求给出全表扫描风险提示其Content还建议SELECT COUNT(*)类请求可改用SHOW TABLE STATUS或EXPLAIN估算rules.go#L296-L303ARG.008OR 查询索引列时请尽量使用 IN 谓词2019-04 修复col 1 OR col IS NULL的边界情况ARG.009 / RuleSpaceWithQuote引号中字符串首尾包含空格2019-04 增加列表范围检查防止误报CLA.009ORDER BY 条件为表达式2018-11 修复大小写不敏感的正则匹配issue #104always true where condition#38即对WHERE 11这类恒真条件的检查索引列比较大小写敏感 bug2019-04修复索引建议中对列名大小写处理不一致的问题。这些修复记录表明每一条规则不仅有规则定义与检测函数还配有对应的测试用例见 advisor/heuristic_test.go 与 advisor/testdata/ 下的 golden 文件。四、索引优化建议Index Advisor的演进4.1 两种模式基于元数据 vs 无环境信息2018-04 同时落地了基于数据库环境信息给予索引优化建议与不依赖数据库元信息的简单索引优化建议两条路径对应 advisor/index.go 中IndexAdvisor在不同 DSN 配置下的工作方式。前者需要连接 MySQL 获取表结构、索引与散粒度cardinality信息后者在没有环境信息时仅基于 SQL 结构给出建议。min-cardinality索引列散粒度最低阈值范围 0.0~100.0就是为此引入的配置。4.2 索引建议的迭代记录2018-05支持前缀索引索引去重2018-06索引优化建议支持对约束的检查2018-07提供索引重复检查小工具即-report-type duplicate-key-checker见 common/config.go 中ReportTypes定义对online-dsn指定库进行重复索引检查其实现位于 advisor/index.go2019-05修复 #205 create index 重写错误、修复 PRIMARY KEY 追加到多列复合索引2019-07、修复索引列比较大小写敏感 bug2019-04索引建议的产出形式IndexAdvisor会生成形如alter table \db.tbl add index ... 的 DDL 建议见 advisor/index.go并附带散粒度百分比等依据信息。索引相关配置在 common/config.go 中成体系max-index-cols-count复合索引最大列数命令行解析时上限强制为 16、max-index-bytes-percolumn默认 767、max-index-bytes默认 3072、max-index-count单表最大索引数默认 10、index-prefix默认idx_、unique-key-prefix默认uk_、allow-drop-index是否允许输出删除重复索引的建议等。五、测试环境与数据采样安全执行 SQL 的关键机制5.1 测试环境生命周期管理soar 采用线上 测试双环境模型。2018-11 引入-cleanup-test-database参数用于清理残余的测试数据库程序异常退出或未开启 drop-test-temporary对应 issue #482019-02 修复 #196错误的 ip/password 会导致 soar -check-config 挂起。cleanup-test-database的执行入口在 cmd/soar/soar.go#L60-L64当该参数开启时程序连接vEnv并调用CleanupTestDatabase()后直接退出。5.2 数据采样的演进2018-05添加数据采样功能并通过sampling-statistic-target控制采样因子2018-06修复数据采样中 NULL 值处理不正确的问题issue #58 在 2018-12 再次被提及说明该问题经过多轮打磨2018-12fix #58 sampling not deal with NULL able string。采样与profiling、trace联动在开启数据采样的情况下可在测试环境执行 Profile 与 Tracecommon/config.go对应 database/profiling.go 与 database/trace.go。5.3 测试数据库2019-01 新增测试数据库world_x与既有 sakila 等标准示例库一起作为测试用例的载体用于验证索引建议与采样逻辑可从 test/ 目录的 bats 测试与 golden 文件看出其用法。六、Explain 分析能力从基础输出到兼容性打磨Explain 是 soar 的另一大支柱其演进记录如下2018-03支持 MySQL Explain 信息输出2018-05/06Explain 支持last_query_cost对应show-last-query-cost配置与max-query-cost警告阈值2019-05为 explain 查询添加max_execution_timehint防止超长查询拖垮测试环境2018-12fix #172 兼容 MySQL 5.1其 EXPLAIN 结果没有Index_Comment列、fix explain 多行结果错误2019-04修复 explain 结果多行时的处理错误。Explain 检查项在配置中自成体系common/config.goexplain-typetraditional/extended/partitions、explain-formatjson/traditional、explain-warn-select-type、explain-warn-access-type默认警告ALL全表扫描、explain-max-keys、explain-max-rows默认 10000、explain-warn-extra默认警告Using temporary与Using filesort、explain-warn-scalability复杂度警告名单支持 O(n)/O(log n)/O(1)/O(?)等。这些检查在 database/explain.go 中解析执行计划后由 advisor/explainer.go 结合配置阈值生成建议。七、报告输出与辅助工具report-type 家族的扩充7.1 输出格式的演进CHANGES.md 记录了报告类型的逐步扩充2018-04引入配置文件与日志模块2018-09新增lint报告类型支持 Vim Plugin 优化建议输出对应 doc/editor_plugin.md 中描述的编辑器插件场景2018-11新增chardet报告类型用于猜测输入 SQL 的字符集新增-cleanup-test-database、-check-config参数2018-12新增ast-json、tiast-json报告类型将 Vitess AST 与 TiDB AST 以 JSON 输出主要用于测试2019-02新增query-type报告类型输出 SQL 语句的请求类型2019-04修复-report-typejson未输出 score 的问题issue #199与 JSON 结果格式问题issue #98。完整的报告类型清单定义在 common/config.go#L847-L957 的ReportTypes中包括lint、markdown、rewrite、ast、ast-json、tiast、tiast-json、tables、query-type、fingerprint、md2html、explain-digest、duplicate-key-checker、html、json、tokenize、compress、pretty、remove-comment、chardet可通过-list-report-types查看common/config.go#L959-L975。7.2 输出细节的修复2019-01新增JSONFind函数支持 JSON 迭代修复 #173WHERE col col and col1 xx场景修复 #178 JSON 数据类型仅支持 utf8mb4 的问题2019-07fingerprint verbose 模式增加 id 输出2019-01修复 #184 表状态字段数据类型溢出、#110 评审前去除 BOM、#112 多行注释导致行计数错误lint 报告类型。7.3 辅助小工具remove-comment去除 SQL 注释支持单行多行与compressSQL 压缩、prettySQL 美化这类报告类型本质上都是单功能小工具2018-07 也明确提到提供 remove-comment 小工具。它们直接复用ast与database包中RemoveSQLComments、Compress、Pretty等函数。八、SQL 切分、解析与重写SplitStatement 与 Rewrite 规则的演进8.1 SplitStatement 的多轮修复SQL 切分是处理多语句输入的入口cmd/soar/soar.go#L116 调用ast.SplitStatement2018-10修复多语句 EOF bug#662018-11修复单行注释位于多行 SQL 中的切分问题#116修复多行注释导致-report-typelint行计数错误#112修复单行注释检查前未去空格#120RemoveSQLComment修复 trim space#1212019-01SplitStatement 支持优化器 hint/*xxx */。8.2 Pretty 与 Tokenizer2018-10修复 pretty 函数挂起问题#472018-11修复 pretty 导致语法错误#1462019-04修复多类型引号混用时的 tokenize bug2019-01修复 #173 中WHERE col col 的 JSONFind 场景。8.3 SQL 重写规则重写功能由-rewrite-rules指定、以-report-type rewrite输出。默认启用的重写规则定义在 common/config.go#L210-L219delimiter分隔符标准化、orderbynullGROUP BY 无谓排序追加 ORDER BY NULL、groupbyconst去除常量 GROUP BY、dmlorderby无意义的 ORDER BY、havingHAVING 改写、star2columnsSELECT * 展开为显式列、insertcolumnsINSERT 显式列名、distinctstar去除无意义 DISTINCT *。规则清单通过-list-rewrite-rules输出实现位于 ast/rewrite.go。2019-05 修复的create index rewrite error#205即属于 DDL 重写范畴。九、配置、底层依赖与工程化演进9.1 配置体系的成型2018-04 引入配置文件。加载逻辑在 common/config.go#L781-L837指定-config时只读该文件未指定时按/etc/soar.yaml→BaseDir/etc/soar.yaml→BaseDir/soar.yaml顺序查找。2018-11 修复了-config参数加载文件错误的问题。仓库自带的示例配置见 etc/soar.yaml。配置项通过-print-config输出密码默认脱敏为********见 common/config.go#L543-L552。9.2 底层依赖的替换2018-12将 MySQL 驱动从 mymysql 替换为 go-sql-driver。该替换带来两个直接收益DSN 解析能力升级common/config.go#L445-L453 中ParseDSN优先使用 go-sql-driver 的解析失败时回退旧版parseDSN以及命令行 DSN 参数支持在密码中包含、/、:等特殊字符2019-02新增 go.mod 以支持 Go 1.11 的模块化构建2018-11将全部第三方库纳入 vendor保证可复现构建。9.3 安全与健壮性2018-12新增字符串转义函数用于安全防护usage()输出中自动对密码做:********脱敏common/config.go#L477-L5412018-11放弃 stdin 终端交互模式该模式易被误认为程序挂起修复 #141 查询在 MySQL 执行失败时输出为空的问题2019-01修复 #184 表状态字段数据类型溢出。9.4 测试与 CI 工程化2018-06添加 main_test 全功能回归测试利用 docker 临时容器进行 daily 测试2018-08Makefile 添加依赖检查、优化逻辑引入 retool 管理依赖工具优化 gometalinter 性能引入新的代码质量检测工具2019-01引入 bats、query.bats、env.bats、other.bats 与 test_helper.bash 即为其产物对应测试输出见test/fixture/下的 golden 文件2018-10使用 Travis 做 CI修复 Go 1.8 默认 GOPATH 兼容问题#5。9.5 开源历程CHANGES.md 明确记录了两个里程碑2018-09-21 Gdevops 首次对外进行技术分享宣传2018-10-20 开源先锋日OSCAR对外正式开源发布代码。2018-08/09 期间更新整理项目文档、开源准备补充文档、添加项目 LOGO等条目说明开源前做了系统的文档化工作。十、小结从变更日志读出的工程方法论回看 CHANGES.md可以提炼出 soar 在 18 个月演进中坚持的三条工程原则规则质量靠边界测试驱动几乎每条规则修复都对应具体 issue 与测试用例规则函数、规则定义、测试用例三者在仓库中一一对应advisor/rules.go ↔ advisor/heuristic.go ↔ advisor/heuristic_test.go兼容性优先从 MySQL 5.1无 Index_Comment 列到 MySQL 8.0驱动升级、JSON 类型从 Go 1.8 到 Go 1.11 模块化持续处理版本差异安全内建字符串转义、DSN 密码脱敏、注入函数检测SEC.004、高危操作提醒SEC.001~003使 soar 不仅是性能工具也是 SQL 质量与安全的守门员。对于希望深入阅读源码的读者建议按如下路径继续探索先读 cmd/soar/soar.go 了解主流程再分别进入 advisor/rules.go规则全集、advisor/index.go索引建议与隐式转换检测、common/config.go全部配置项与默认值、database/explain.go执行计划解析。如果你想验证某一版本的修复行为test/fixture/下的 golden 文件是最直接的回归证据。注本文所述能力与修复均以 CHANGES.md 收录的时间范围2018-03 至 2019-08及当前仓库源码为准版本演进以仓库实际内容为限。赞分享开发工具数据库【免费下载链接】soarSQL Optimizer And Rewriter项目地址https://gitcode.com/gh_mirrors/so/soar点击查看免费下载相关推荐SOAR 安装指南下载发布二进制、从源码构建与快速验证SQL Optimizer And RewriterSOAR 安装指南下载发布二进制、从源码构建与快速验证SQL Optimizer And Rewriter 本篇指南完整讲解 SQL 优化与重写工具 SO开发工具数据库SOAR小米开源的 SQL 优化与改写工具SQL Optimizer And Rewriter实战指南SOAR小米开源的 SQL 优化与改写工具SQL Optimizer And Rewriter实战指南 SOARSQL Optimizer And Re开发工具数据库终极文档下载工具指南一键免费下载30文库平台的完整教程终极文档下载工具指南一键免费下载30文库平台的完整教程 还在为百度文库的登录验证烦恼吗还在为道客巴巴的广告弹窗头疼吗kill doc文档下载工具就是你需开发工具数据库上一篇TegraRcmGUI完全使用指南Nintendo Switch设备开发与维护工具详解下一篇Asciidoctor与AsciiDoc.py的终极区别为什么你应该立即升级的10个关键理由创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站