diff --git a/advisor/rules.go b/advisor/rules.go index e3a01cacef723cdc29f6516de5a3a858c32a31ea..0f5da8b2bde176853bc658aacb46d12c5972926b 100644 --- a/advisor/rules.go +++ b/advisor/rules.go @@ -111,6 +111,11 @@ type Rule struct { var HeuristicRules map[string]Rule func init() { + InitHeuristicRules() +} + +// InitHeuristicRules ... +func InitHeuristicRules() { HeuristicRules = map[string]Rule{ "OK": { Item: "OK", @@ -579,9 +584,9 @@ func init() { }, "COL.018": { Item: "COL.018", - Severity: "L1", + Severity: "L9", Summary: "建表语句中使用了不推荐的字段类型", - Content: "以下字段类型不被推荐使用:" + strings.Join(common.Config.ColumnNotAllowType, ","), + Content: "以下字段类型不被推荐使用:" + strings.Join(common.Config.ColumnNotAllowType, ", "), Case: "CREATE TABLE tab (a BOOLEAN);", Func: (*Query4Audit).RuleColumnNotAllowType, }, diff --git a/advisor/testdata/TestListHeuristicRules.golden b/advisor/testdata/TestListHeuristicRules.golden index ea05609fc8c5ecbbc85d9c114d106d8bffe5e5d0..41bf7c005b2e3881302b2b760248b0af500e2954 100644 --- a/advisor/testdata/TestListHeuristicRules.golden +++ b/advisor/testdata/TestListHeuristicRules.golden @@ -545,7 +545,7 @@ CREATE TABLE tab (a varchar(3500)); ## 建表语句中使用了不推荐的字段类型 * **Item**:COL.018 -* **Severity**:L1 +* **Severity**:L9 * **Content**:以下字段类型不被推荐使用:boolean * **Case**: diff --git a/advisor/testdata/TestMergeConflictHeuristicRules.golden b/advisor/testdata/TestMergeConflictHeuristicRules.golden index 36f01bc9966e91d743cde92ed541db1ec40e45bd..431af4cec26bf0df4bfb653abee7415019c30ca3 100644 --- a/advisor/testdata/TestMergeConflictHeuristicRules.golden +++ b/advisor/testdata/TestMergeConflictHeuristicRules.golden @@ -51,7 +51,7 @@ advisor.Rule{Item:"COL.014", Severity:"L5", Summary:"为列指定了字符集", advisor.Rule{Item:"COL.015", Severity:"L4", Summary:"TEXT、BLOB 和 JSON 类型的字段不可指定非 NULL 的默认值", Content:"MySQL 数据库中 TEXT、BLOB 和 JSON 类型的字段不可指定非 NULL 的默认值。TEXT最大长度为2^16-1个字符,MEDIUMTEXT最大长度为2^32-1个字符,LONGTEXT最大长度为2^64-1个字符。", Case:"CREATE TABLE `tbl` (`c` blob DEFAULT NULL);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"COL.016", Severity:"L1", Summary:"整型定义建议采用 INT(10) 或 BIGINT(20)", Content:"INT(M) 在 integer 数据类型中,M 表示最大显示宽度。 在 INT(M) 中,M 的值跟 INT(M) 所占多少存储空间并无任何关系。 INT(3)、INT(4)、INT(8) 在磁盘上都是占用 4 bytes 的存储空间。高版本 MySQL 已经不推荐设置整数显示宽度。", Case:"CREATE TABLE tab (a INT(1));", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"COL.017", Severity:"L2", Summary:"VARCHAR 定义长度过长", Content:"varchar 是可变长字符串,不预先分配存储空间,长度不要超过1024,如果存储长度过长 MySQL 将定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。", Case:"CREATE TABLE tab (a varchar(3500));", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} -advisor.Rule{Item:"COL.018", Severity:"L1", Summary:"建表语句中使用了不推荐的字段类型", Content:"以下字段类型不被推荐使用:boolean", Case:"CREATE TABLE tab (a BOOLEAN);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} +advisor.Rule{Item:"COL.018", Severity:"L9", Summary:"建表语句中使用了不推荐的字段类型", Content:"以下字段类型不被推荐使用:boolean", Case:"CREATE TABLE tab (a BOOLEAN);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"COL.019", Severity:"L1", Summary:"不建议使用精度在秒级以下的时间数据类型", Content:"使用高精度的时间数据类型带来的存储空间消耗相对较大;MySQL 在5.6.4以上才可以支持精确到微秒的时间数据类型,使用时需要考虑版本兼容问题。", Case:"CREATE TABLE t1 (t TIME(3), dt DATETIME(6));", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"DIS.001", Severity:"L1", Summary:"消除不必要的 DISTINCT 条件", Content:"太多DISTINCT条件是复杂的裹脚布式查询的症状。考虑将复杂查询分解成许多简单的查询,并减少DISTINCT条件的数量。如果主键列是列的结果集的一部分,则DISTINCT条件可能没有影响。", Case:"SELECT DISTINCT c.c_id,count(DISTINCT c.c_name),count(DISTINCT c.c_e),count(DISTINCT c.c_n),count(DISTINCT c.c_me),c.c_d FROM (select distinct id, name from B) as e WHERE e.country_id = c.country_id", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"DIS.002", Severity:"L3", Summary:"COUNT(DISTINCT) 多列时结果可能和你预想的不同", Content:"COUNT(DISTINCT col) 计算该列除NULL之外的不重复行数,注意 COUNT(DISTINCT col, col2) 如果其中一列全为 NULL 那么即使另一列有不同的值,也返回0。", Case:"SELECT COUNT(DISTINCT col, col2) FROM tbl;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} diff --git a/cmd/soar/tool.go b/cmd/soar/tool.go index 361a4d2ff6b4d714627fcbcbe7fd3e72b18e37e2..d12c3c236e4fdafeb3dd9cc617be98fe7cac2773 100644 --- a/cmd/soar/tool.go +++ b/cmd/soar/tool.go @@ -60,6 +60,10 @@ func initConfig() { fmt.Println(err.Error()) os.Exit(1) } + + // 更新 HeuristicRules 中与配置相关的文字 + advisor.InitHeuristicRules() + common.LogIfWarn(err, "") } diff --git a/common/testdata/TestPrintConfiguration.golden b/common/testdata/TestPrintConfiguration.golden index 8dde11ff31508f1080934059b5b33abe3606d4a1..eea86528602f11da8d1f4665709765bcb4153ed7 100644 --- a/common/testdata/TestPrintConfiguration.golden +++ b/common/testdata/TestPrintConfiguration.golden @@ -95,6 +95,8 @@ unique-key-prefix: uk_ max-subquery-depth: 5 max-varchar-length: 1024 column-not-allow-type: +- json +- text - boolean min-cardinality: 0 explain-sql-report-type: pretty diff --git a/doc/heuristic.md b/doc/heuristic.md index ea05609fc8c5ecbbc85d9c114d106d8bffe5e5d0..41bf7c005b2e3881302b2b760248b0af500e2954 100644 --- a/doc/heuristic.md +++ b/doc/heuristic.md @@ -545,7 +545,7 @@ CREATE TABLE tab (a varchar(3500)); ## 建表语句中使用了不推荐的字段类型 * **Item**:COL.018 -* **Severity**:L1 +* **Severity**:L9 * **Content**:以下字段类型不被推荐使用:boolean * **Case**: diff --git a/etc/soar.yaml b/etc/soar.yaml index 7202d2112fa0fafcf825d61ae0419687c6f81518..ee9760f5194d131a8186e4c532c3d87b374129ab 100644 --- a/etc/soar.yaml +++ b/etc/soar.yaml @@ -15,6 +15,10 @@ test-dsn: # 高危,仅测试时使用,线上环境禁止配置为 true allow-online-as-test: true +column-not-allow-type: +- json +- text +- boolean log-level: 7 log-output: soar.log