提交 d096d6f5 编写于 作者: martianzhang's avatar martianzhang

fix HeuristicRules init bug & update rule COL.018

	column-not-allow-type show be L9 as it's name said
上级 b93aad46
......@@ -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,
},
......
......@@ -545,7 +545,7 @@ CREATE TABLE tab (a varchar(3500));
## 建表语句中使用了不推荐的字段类型
* **Item**:COL.018
* **Severity**:L1
* **Severity**:L9
* **Content**:以下字段类型不被推荐使用:boolean
* **Case**:
......
......@@ -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 {...}}
......
......@@ -60,6 +60,10 @@ func initConfig() {
fmt.Println(err.Error())
os.Exit(1)
}
// 更新 HeuristicRules 中与配置相关的文字
advisor.InitHeuristicRules()
common.LogIfWarn(err, "")
}
......
......@@ -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
......
......@@ -545,7 +545,7 @@ CREATE TABLE tab (a varchar(3500));
## 建表语句中使用了不推荐的字段类型
* **Item**:COL.018
* **Severity**:L1
* **Severity**:L9
* **Content**:以下字段类型不被推荐使用:boolean
* **Case**:
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册