From 5b5d1604f7a6121be3777a6f21ea463e5929949b Mon Sep 17 00:00:00 2001 From: martianzhang Date: Thu, 1 Nov 2018 21:49:28 +0800 Subject: [PATCH] use markdownlint format doc --- cmd/soar/soar.go | 98 +++++++++++++++++------------------ doc/FAQ.md | 34 +++++++----- doc/images/windows_quote.png | Bin 0 -> 37687 bytes 3 files changed, 71 insertions(+), 61 deletions(-) create mode 100644 doc/images/windows_quote.png diff --git a/cmd/soar/soar.go b/cmd/soar/soar.go index d05b1ea..44982f7 100644 --- a/cmd/soar/soar.go +++ b/cmd/soar/soar.go @@ -38,18 +38,18 @@ import ( func main() { // 全局变量 - var sql string // 单条评审指定的sql或explain + var sql string // 单条评审指定的 sql 或 explain sqlCounter := 1 // SQL 计数器 lineCounter := 1 // 行计数器 - var alterSqls []string // 待评审的SQL中所有ALTER请求 - alterTableTimes := make(map[string]int) // 待评审的SQL中同一经表ALTER请求计数器 - suggestMerged := make(map[string]map[string]advisor.Rule) // 优化建议去重,key为sql的fingerprint.ID + var alterSqls []string // 待评审的 SQL 中所有 ALTER 请求 + alterTableTimes := make(map[string]int) // 待评审的 SQL 中同一经表 ALTER 请求计数器 + suggestMerged := make(map[string]map[string]advisor.Rule) // 优化建议去重, key 为 sql 的 fingerprint.ID ex, err := os.Executable() if err != nil { panic(err) } - common.BaseDir = filepath.Dir(ex) // binary文件所在路径 + common.BaseDir = filepath.Dir(ex) // binary 文件所在路径 // 配置文件&命令行参数解析 err = common.ParseConfig("") @@ -61,17 +61,17 @@ func main() { advisor.ListHeuristicRules(advisor.HeuristicRules) return } - // 打印支持的SQL重写规则 + // 打印支持的 SQL 重写规则 if common.Config.ListRewriteRules { ast.ListRewriteRules(ast.RewriteRules) return } - // 打印所有的测试SQL + // 打印所有的测试 SQL if common.Config.ListTestSqls { advisor.ListTestSQLs() return } - // 打印支持的report-type + // 打印支持的 report-type if common.Config.ListReportTypes { common.ListReportTypes() return @@ -97,7 +97,7 @@ func main() { return } - // 读入待优化SQL,当配置文件或命令行参数未指定SQL时从管道读取 + // 读入待优化 SQL ,当配置文件或命令行参数未指定 SQL 时从管道读取 if common.Config.Query == "" { var data []byte data, err = ioutil.ReadAll(os.Stdin) @@ -123,7 +123,7 @@ func main() { switch common.Config.ReportType { case "html": - // HTML格式输入CSS加载 + // HTML 格式输入 CSS 加载 fmt.Println(common.MarkdownHTMLHeader()) case "md2html": // markdown2html 转换小工具 @@ -131,8 +131,8 @@ func main() { fmt.Println(common.Markdown2HTML(sql)) return case "explain-digest": - // 当用户输入为EXPLAIN信息,只对Explain信息进行分析 - // 注意: 这里只能处理一条SQL的EXPLAIN信息,用户一次反馈多条SQL的EXPLAIN信息无法处理 + // 当用户输入为 EXPLAIN信 息,只对 Explain 信息进行分析 + // 注意: 这里只能处理一条 SQL 的 EXPLAIN 信息,用户一次反馈多条 SQL 的 EXPLAIN 信息无法处理 advisor.DigestExplainText(sql) return case "remove-comment": @@ -146,11 +146,11 @@ func main() { for ; ; sqlCounter++ { var id string // fingerprint.ID heuristicSuggest := make(map[string]advisor.Rule) // 启发式建议 - expSuggest := make(map[string]advisor.Rule) // EXPLAIN解读 + expSuggest := make(map[string]advisor.Rule) // EXPLAIN 解读 idxSuggest := make(map[string]advisor.Rule) // 索引建议 - proSuggest := make(map[string]advisor.Rule) // Profiling信息 - traceSuggest := make(map[string]advisor.Rule) // Trace信息 - mysqlSuggest := make(map[string]advisor.Rule) // MySQL返回的ERROR信息 + proSuggest := make(map[string]advisor.Rule) // Profiling 信息 + traceSuggest := make(map[string]advisor.Rule) // Trace 信息 + mysqlSuggest := make(map[string]advisor.Rule) // MySQL 返回的 ERROR 信息 if buf == "" { common.Log.Debug("buf: %s, sql: %s empty", buf, sql) @@ -178,15 +178,15 @@ func main() { fingerprint := strings.TrimSpace(query.Fingerprint(sql)) switch common.Config.ReportType { case "fingerprint": - // SQL指纹 + // SQL 指纹 fmt.Println(fingerprint) continue case "pretty": - // SQL美化 + // SQL 美化 fmt.Println(ast.Pretty(sql, "builtin") + common.Config.Delimiter) continue case "compress": - // SQL压缩 + // SQL 压缩 fmt.Println(ast.Compress(sql) + common.Config.Delimiter) continue case "ast": @@ -210,10 +210,10 @@ func main() { common.LogIfWarn(err, "") continue default: - // SQL签名 + // SQL 签名 id = query.Id(fingerprint) // 建议去重,减少评审整个文件耗时 - // TODO: 由于 a = 11和a = '11'的fingerprint相同,这里一旦跳过即无法检查有些建议了,如:ARG.003 + // TODO: 由于 a = 11 和 a = '11' 的 fingerprint 相同,这里一旦跳过即无法检查有些建议了,如: ARG.003 if _, ok := suggestMerged[id]; ok { continue } @@ -230,7 +230,7 @@ func main() { switch stmt.(type) { case *sqlparser.DDL: - // 因为vitess的parser对于DDL语法支持不好,通过在测试环境执行辅助进行语法检查 + // 因为 vitess 的 parser 对于 DDL 语法支持不好,通过在测试环境执行辅助进行语法检查 if common.Config.OnlySyntaxCheck && vEnv.BuildVirtualEnv(rEnv, sql) { syntaxErr = vEnv.Error } @@ -248,7 +248,7 @@ func main() { if !common.Config.DryRun { os.Exit(1) } - // vitess 语法检查给出的建议ERR.000 + // vitess 语法检查给出的建议 ERR.000 if common.Config.TestDSN.Disable { mysqlSuggest["ERR.000"] = advisor.RuleMySQLError("ERR.000", syntaxErr) } @@ -277,14 +277,14 @@ func main() { // +++++++++++++++++++++索引优化建议[开始]+++++++++++++++++++++++{ // 如果配置了索引建议过滤规则,不进行索引优化建议 - // 在配置文件ignore-rules中添加 'IDX.*'即可屏蔽索引优化建议 + // 在配置文件 ignore-rules 中添加 'IDX.*' 即可屏蔽索引优化建议 common.Log.Debug("start of index advisor Query: %s", q.Query) if !advisor.IsIgnoreRule("IDX.") { if vEnv.BuildVirtualEnv(rEnv, q.Query) { idxAdvisor, err := advisor.NewAdvisor(vEnv, *rEnv, *q) if err != nil || (idxAdvisor == nil && vEnv.Error == nil) { if idxAdvisor == nil { - // 如果SQL是DDL语句,则返回的idxAdvisor为nil,可以忽略不处理 + // 如果 SQL 是 DDL 语句,则返回的 idxAdvisor 为 nil,可以忽略不处理 // TODO alter table add index 语句检查索引是否已经存在 common.Log.Debug("idxAdvisor by pass Query: %s", q.Query) } else { @@ -311,7 +311,7 @@ func main() { Case: sql, } default: - // vEnv.VEnvBuild阶段给出的ERROR是ERR.001 + // vEnv.VEnvBuild 阶段给出的 ERROR 是 ERR.001 mysqlSuggest["ERR.001"] = advisor.RuleMySQLError("ERR.001", vEnv.Error) common.Log.Error("BuildVirtualEnv DDL Execute Error : %v", vEnv.Error) } @@ -324,30 +324,30 @@ func main() { common.Log.Debug("end of index advisor Query: %s", q.Query) // +++++++++++++++++++++索引优化建议[结束]+++++++++++++++++++++++} - // +++++++++++++++++++++EXPLAIN建议[开始]+++++++++++++++++++++++{ - // 如果未配置Online或Test无法给Explain建议 + // +++++++++++++++++++++EXPLAIN 建议[开始]+++++++++++++++++++++++{ + // 如果未配置 Online 或 Test 无法给 Explain 建议 common.Log.Debug("start of explain Query: %s", q.Query) if !common.Config.OnlineDSN.Disable && !common.Config.TestDSN.Disable { - // 因为EXPLAIN依赖数据库环境,所以把这段逻辑放在启发式建议和索引建议后面 + // 因为 EXPLAIN 依赖数据库环境,所以把这段逻辑放在启发式建议和索引建议后面 if common.Config.Explain { - // 执行EXPLAIN + // 执行 EXPLAIN explainInfo, err := rEnv.Explain(q.Query, database.ExplainType[common.Config.ExplainType], database.ExplainFormatType[common.Config.ExplainFormat]) if err != nil { - // 线上环境执行失败才到测试环境EXPLAIN,比如在用户提供建表语句及查询语句的场景 + // 线上环境执行失败才到测试环境 EXPLAIN,比如在用户提供建表语句及查询语句的场景 common.Log.Warn("rEnv.Explain Warn: %v", err) explainInfo, err = vEnv.Explain(q.Query, database.ExplainType[common.Config.ExplainType], database.ExplainFormatType[common.Config.ExplainFormat]) if err != nil { - // EXPLAIN阶段给出的ERROR是ERR.002 + // EXPLAIN 阶段给出的 ERROR 是 ERR.002 mysqlSuggest["ERR.002"] = advisor.RuleMySQLError("ERR.002", err) common.Log.Error("vEnv.Explain Error: %v", err) continue } } - // 分析EXPLAIN结果 + // 分析 EXPLAIN 结果 if explainInfo != nil { expSuggest = advisor.ExplainAdvisor(explainInfo) } else { @@ -356,9 +356,9 @@ func main() { } } common.Log.Debug("end of explain Query: %s", q.Query) - // +++++++++++++++++++++EXPLAIN建议[结束]+++++++++++++++++++++++} + // +++++++++++++++++++++ EXPLAIN 建议[结束]+++++++++++++++++++++++} - // +++++++++++++++++++++Profiling[开始]+++++++++++++++++++++++++{ + // +++++++++++++++++++++ Profiling [开始]+++++++++++++++++++++++++{ common.Log.Debug("start of profiling Query: %s", q.Query) if common.Config.Profiling { res, err := vEnv.Profiling(q.Query) @@ -373,9 +373,9 @@ func main() { } } common.Log.Debug("end of profiling Query: %s", q.Query) - // +++++++++++++++++++++Profiling[结束]++++++++++++++++++++++++++} + // +++++++++++++++++++++ Profiling [结束]++++++++++++++++++++++++++} - // +++++++++++++++++++++Trace [开始]+++++++++++++++++++++++++{ + // +++++++++++++++++++++ Trace [开始]+++++++++++++++++++++++++{ common.Log.Debug("start of trace Query: %s", q.Query) if common.Config.Trace { res, err := vEnv.Trace(q.Query) @@ -392,14 +392,14 @@ func main() { common.Log.Debug("end of trace Query: %s", q.Query) // +++++++++++++++++++++Trace [结束]++++++++++++++++++++++++++} - // +++++++++++++++++++++SQL重写[开始]+++++++++++++++++++++++++{ + // +++++++++++++++++++++SQL 重写[开始]+++++++++++++++++++++++++{ common.Log.Debug("start of rewrite Query: %s", q.Query) if common.Config.ReportType == "rewrite" { if strings.HasPrefix(strings.TrimSpace(strings.ToLower(sql)), "create") || strings.HasPrefix(strings.TrimSpace(strings.ToLower(sql)), "alter") || strings.HasPrefix(strings.TrimSpace(strings.ToLower(sql)), "rename") { - // 依赖上下文件的SQL重写,如:多条ALTER SQL合并 - // vitess对DDL语法的支持不好,大部分DDL会语法解析出错,但即使出错了还是会生成一个stmt而且里面的db.table还是准确的。 + // 依赖上下文件的 SQL 重写,如:多条 ALTER SQL 合并 + // vitess 对 DDL 语法的支持不好,大部分 DDL 会语法解析出错,但即使出错了还是会生成一个 stmt 而且里面的 db.table 还是准确的。 alterSqls = append(alterSqls, sql) alterTbl := ast.AlterAffectTable(stmt) @@ -412,25 +412,25 @@ func main() { } } } else { - // 其他不依赖上下文件的SQL重写 + // 其他不依赖上下文件的 SQL 重写 rw := ast.NewRewrite(sql) if rw == nil { - // 都到这一步了sql不会语法不正确,因此rw一般不会为nil + // 都到这一步了 sql 不会语法不正确,因此 rw 一般不会为 nil common.Log.Critical("NewRewrite nil point error, SQL: %s", sql) os.Exit(1) } - // SQL转写需要的源信息采集,如果没有配置环境则只做有限改写 + // SQL 转写需要的源信息采集,如果没有配置环境则只做有限改写 meta := ast.GetMeta(rw.Stmt, nil) rw.Columns = vEnv.GenTableColumns(meta) - // 执行定义好的SQL重写规则 + // 执行定义好的 SQL 重写规则 rw.Rewrite() fmt.Println(strings.TrimSpace(rw.NewSQL)) } } common.Log.Debug("end of rewrite Query: %s", q.Query) - // +++++++++++++++++++++SQL重写[结束]++++++++++++++++++++++++++} + // +++++++++++++++++++++ SQL 重写[结束]++++++++++++++++++++++++++} - // +++++++++++++++++++++打印单条SQL优化建议[开始]++++++++++++++++++++++++++{ + // +++++++++++++++++++++打印单条 SQL 优化建议[开始]++++++++++++++++++++++++++{ common.Log.Debug("start of print suggestions, Query: %s", q.Query) sug, str := advisor.FormatSuggest(q.Query, common.Config.ReportType, heuristicSuggest, idxSuggest, expSuggest, proSuggest, traceSuggest, mysqlSuggest) suggestMerged[id] = sug @@ -462,10 +462,10 @@ func main() { fmt.Println(str) } common.Log.Debug("end of print suggestions, Query: %s", q.Query) - // +++++++++++++++++++++打印单条SQL优化建议[结束]++++++++++++++++++++++++++} + // +++++++++++++++++++++打印单条 SQL 优化建议[结束]++++++++++++++++++++++++++} } - // 同一张表的多条ALTER语句合并为一条 + // 同一张表的多条 ALTER 语句合并为一条 if ast.RewriteRuleMatch("mergealter") { for _, v := range ast.MergeAlterTables(alterSqls...) { fmt.Println(strings.TrimSpace(v)) @@ -473,7 +473,7 @@ func main() { return } - // 以JSON格式化输出 + // 以 JSON 格式化输出 if common.Config.ReportType == "json" { js, err := json.MarshalIndent(suggestMerged, "", " ") if err == nil { diff --git a/doc/FAQ.md b/doc/FAQ.md index ff9206b..c02d4c8 100644 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -1,30 +1,40 @@ -## 常见问题 +# 常见问题 -### 软件依赖 +## 软件依赖 * [git](https://git-scm.co) 项目代码管理工具 * [go](https://golang.org/) 源码编译依赖 * [govendor](https://github.com/kardianos/govendor) 管理第三方包 * [docker](https://www.docker.com) 主要用于构建测试环境 * [mysql](https://www.mysql.com/) 测试时用来连接测试环境 -* [retool](https://github.com/twitchtv/retool): 管理测试开发工具,首次安装耗时会比较长,如:`gometalinter.v2`, `revive`, `golangci-lint` +* [retool](https://github.com/twitchtv/retool): 管理测试开发工具,首次安装耗时会比较长,如: `gometalinter.v2`, `revive`, `golangci-lint` -### 命令行参数`test-dsn`, `online-dsn`中包含特殊字符怎么办? +## 命令行参数 `test-dsn`, `online-dsn` 中包含特殊字符怎么办? -如果`test-dsn`或`online-dsn`中包含':', '@', '/', '!'等特殊字符建议在配置文件中配置相关信息,配置文件为YAML格式,需要遵守YAML格式的要求规范。 +如果 `test-dsn` 或 `online-dsn` 中包含':', '@', '/', '!'等特殊字符建议在配置文件中配置相关信息,配置文件为YAML格式,需要遵守YAML格式的要求规范。 -### Windows环境下双击`soar.windows-amd64`文件无反应。 +## Windows环境下双击`soar.windows-amd64`文件无反应。 -`soar`是命令行工具,不是图形化桌面工具,Windows环境需要在`cmd.exe`下以命令行方式运行。使用`soar`前您需要先熟悉Windows命令行使用。 +`soar` 是命令行工具,不是图形化桌面工具,Windows环境需要在 `cmd.exe` 下以命令行方式运行。使用 `soar` 前您需要先熟悉Windows命令行使用。 -### 提示语法错误 +## Windows 用户的引号问题 + +![windows_quote](https://raw.githubusercontent.com/XiaoMi/soar/master/doc/images/windows_quote.png) + +从上图可以看出 Windows 环境下引号(单引号或双引号)也成为了SQL的一部分传递给 soar 进行分析。因此 Windows 环境下使用如下方式读取 SQL 来解决 Windows 的引号问题。 + +```bash +type query.sql | soar.windows-amd64 +``` + +## 提示语法错误 * 请检查SQL语句中是否出现了不配对的引号,如 `, ", ' -### 输出结果返回慢 +## 输出结果返回慢 -* 如果配置了online-dsn或test-dsn SOAR会请求这些数据库以支持更多的功能,这时评审一条SQL就会耗时变长。 -* 如果又开启了`-sampling=true`的话会将线上的数据导入到测试环境,数据采样也会消耗一些时间。 +* 如果配置了 online-dsn 或 test-dsn SOAR 会请求这些数据库以支持更多的功能,这时评审一条SQL就会耗时变长。 +* 如果又开启了 `-sampling=true` 的话会将线上的数据导入到测试环境,数据采样也会消耗一些时间。 ## 如何搭建测试环境 @@ -47,7 +57,7 @@ GRANT ALL ON *.* TO root@'hostname'; 如属更新vitess仓库可以使用如下命令。 ```bash -$ make vitess +make vitess ``` ## 生成报告并发邮件 diff --git a/doc/images/windows_quote.png b/doc/images/windows_quote.png new file mode 100644 index 0000000000000000000000000000000000000000..91384c49c2ecd157971ef6eb5407ae429b4a22d6 GIT binary patch literal 37687 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 D`qa&$ literal 0 HcmV?d00001 -- GitLab