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

fix #213

  fix #213 CLA.001 NO WHERE CONDITION
  fix PRIMARY key append to multi column index
上级 aeb78681
......@@ -329,7 +329,7 @@ func (idxAdv *IndexAdvisor) RuleImplicitConversion() Rule {
continue
}
c := fmt.Sprintf("%s表中列%s的定义是 %s 而不是 %s",
c := fmt.Sprintf("%s表中列%s的定义是 %s 而不是 %s",
colList[0].Table, colList[0].Name, colList[0].DataType, typNameMap[val.Type])
common.Log.Debug("Implicit data type conversion: %s", c)
......@@ -356,6 +356,12 @@ func (q *Query4Audit) RuleNoWhere() Rule {
err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) {
switch n := node.(type) {
case *sqlparser.Select:
for _, f := range n.From {
switch f.(type) {
case *sqlparser.JoinTableExpr:
return false, nil
}
}
if n.Where == nil && sqlparser.String(n.From) != "dual" {
rule = HeuristicRules["CLA.001"]
return false, nil
......
......@@ -283,31 +283,31 @@ func (idxAdv *IndexAdvisor) IndexAdvise() IndexAdvises {
// 有Where条件的先分析 等值条件
for _, index := range idxAdv.whereEQ {
// 对应列在前面已经按散粒度由大到小排序好了
mergeIndex(indexList, index)
idxAdv.mergeIndex(indexList, index)
}
// 若存在非等值查询条件,可以给第一个非等值条件添加索引
if len(idxAdv.whereINEQ) > 0 {
mergeIndex(indexList, idxAdv.whereINEQ[0])
idxAdv.mergeIndex(indexList, idxAdv.whereINEQ[0])
}
// 有WHERE条件,但 WHERE 条件未能给出索引建议就不能再加 GROUP BY 和 ORDER BY 建议了
if len(ignore) == 0 {
// 没有非等值查询条件时可以再为 GroupBy 和 OrderBy 添加索引
for _, index := range idxAdv.groupBy {
mergeIndex(indexList, index)
idxAdv.mergeIndex(indexList, index)
}
// OrderBy
// 没有 GroupBy 时可以为 OrderBy 加索引
if len(idxAdv.groupBy) == 0 {
for _, index := range idxAdv.orderBy {
mergeIndex(indexList, index)
idxAdv.mergeIndex(indexList, index)
}
}
}
} else {
// 未指定 Where 条件的,只需要 GroupBy 和 OrderBy 的索引建议
for _, index := range idxAdv.groupBy {
mergeIndex(indexList, index)
idxAdv.mergeIndex(indexList, index)
}
// OrderBy
......@@ -628,7 +628,7 @@ func (idxAdv *IndexAdvisor) buildJoinIndex(meta common.Meta) []IndexInfo {
// 如果该列的库表为join condition中需要添加索引的库表
indexColsList := make(map[string]map[string][]*common.Column)
for _, col := range IndexCols {
mergeIndex(indexColsList, col)
idxAdv.mergeIndex(indexColsList, col)
}
if common.Config.TestDSN.Disable || common.Config.OnlineDSN.Disable {
......@@ -722,7 +722,7 @@ func (idxAdv *IndexAdvisor) buildIndexWithNoEnv(indexList map[string]map[string]
}
// mergeIndex 将索引用到的列去重后合并到一起
func mergeIndex(idxList map[string]map[string][]*common.Column, column *common.Column) {
func (idxAdv *IndexAdvisor) mergeIndex(idxList map[string]map[string][]*common.Column, column *common.Column) {
// 散粒度低于阈值将不会添加索引
if common.Config.MinCardinality/100 > column.Cardinality {
return
......@@ -744,6 +744,21 @@ func mergeIndex(idxList map[string]map[string][]*common.Column, column *common.C
exist = true
}
}
// 将 DB 替换成 vEnv 中的数据库名称
dbInVEnv := db
if _, ok := idxAdv.vEnv.DBRef[db]; ok {
dbInVEnv = idxAdv.vEnv.DBRef[db]
}
indexMeta := idxAdv.IndexMeta[dbInVEnv][tb]
// 主键列不需要追加
pr := indexMeta.FindIndex(database.IndexKeyName, "PRIMARY")
for _, c := range pr {
if c.ColumnName == column.Name {
exist = true
}
}
if !exist {
idxList[db][tb] = append(idxList[db][tb], column)
}
......
# Query: E813EA038141E9CE
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -12,11 +12,5 @@ FROM
JOIN d
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: E813EA038141E9CE
★ ★ ★ ☆ ☆ 70分
★ ★ ★ ★ ☆ 90分
```sql
......@@ -12,14 +12,6 @@ FROM
JOIN d
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 减少 JOIN 的数量
* **Item:** JOI.005
......
......@@ -954,7 +954,7 @@ ORDER BY
# Query: 4ECCA9568BE69E68
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -973,14 +973,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -991,7 +983,7 @@ FROM
# Query: 485D56FC88BBBDB9
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -1010,14 +1002,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -1028,7 +1012,7 @@ FROM
# Query: 0D0DABACEDFF5765
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -1047,14 +1031,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -1143,7 +1119,7 @@ WHERE
# Query: 17D5BCF21DC2364C
★ ★ ★ ☆ ☆ 65分
★ ★ ★ ★ ☆ 85分
```sql
......@@ -1168,14 +1144,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -1241,7 +1209,7 @@ WHERE
# Query: 3FF20E28EC9CBEF9
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -1252,17 +1220,11 @@ FROM
JOIN country
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: 5C547F08EADBB131
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -1273,17 +1235,11 @@ FROM
LEFT JOIN country
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: AF0C1EB58B23D2FA
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -1294,17 +1250,11 @@ FROM
RIGHT JOIN country
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: 626571EAE84E2C8A
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -1322,14 +1272,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
# Query: 50F2AB4243CE2071
★ ★ ★ ☆ ☆ 60分
......@@ -1374,7 +1316,7 @@ FROM
# Query: 584CCEC8069B6947
★ ★ ☆ ☆ ☆ 40分
★ ★ ★ ☆ ☆ 60分
```sql
......@@ -1397,14 +1339,6 @@ ORDER BY
city DESC
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 同一张表被连接两次
* **Item:** JOI.002
......@@ -1929,7 +1863,7 @@ LIMIT
# Query: 16CB4628D2597D40
★ ★ ★ ☆ ☆ 65分
★ ★ ★ ★ ☆ 85分
```sql
......@@ -1954,14 +1888,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -2084,7 +2010,7 @@ WHERE
# Query: 1E8B70E30062FD13
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -2094,17 +2020,11 @@ FROM
customer STRAIGHT_JOIN address ON customer. address_id= address. address_id
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: E48A20D0413512DA
☆ ☆ ☆ ☆ 30分
★ ☆ ☆ ☆ 50分
```sql
......@@ -2136,14 +2056,6 @@ ORDER BY
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## ORDER BY 语句对多个不同条件使用不同方向的排序无法使用索引
* **Item:** CLA.007
......
......@@ -954,7 +954,7 @@ ORDER BY
# Query: 4ECCA9568BE69E68
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -973,14 +973,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -991,7 +983,7 @@ FROM
# Query: 485D56FC88BBBDB9
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -1010,14 +1002,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -1028,7 +1012,7 @@ FROM
# Query: 0D0DABACEDFF5765
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -1047,14 +1031,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -1143,7 +1119,7 @@ WHERE
# Query: 17D5BCF21DC2364C
★ ★ ★ ☆ ☆ 65分
★ ★ ★ ★ ☆ 85分
```sql
......@@ -1168,14 +1144,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -1241,7 +1209,7 @@ WHERE
# Query: 3FF20E28EC9CBEF9
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -1252,17 +1220,11 @@ FROM
JOIN country
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: 5C547F08EADBB131
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -1273,17 +1235,11 @@ FROM
LEFT JOIN country
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: AF0C1EB58B23D2FA
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -1294,17 +1250,11 @@ FROM
RIGHT JOIN country
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: 626571EAE84E2C8A
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -1322,14 +1272,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
# Query: 50F2AB4243CE2071
★ ★ ★ ☆ ☆ 60分
......@@ -1374,7 +1316,7 @@ FROM
# Query: 584CCEC8069B6947
★ ★ ☆ ☆ ☆ 40分
★ ★ ★ ☆ ☆ 60分
```sql
......@@ -1397,14 +1339,6 @@ ORDER BY
city DESC
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 同一张表被连接两次
* **Item:** JOI.002
......@@ -1929,7 +1863,7 @@ LIMIT
# Query: 16CB4628D2597D40
★ ★ ★ ☆ ☆ 65分
★ ★ ★ ★ ☆ 85分
```sql
......@@ -1954,14 +1888,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -2084,7 +2010,7 @@ WHERE
# Query: 1E8B70E30062FD13
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -2094,17 +2020,11 @@ FROM
customer STRAIGHT_JOIN address ON customer. address_id= address. address_id
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## OK
# Query: E48A20D0413512DA
☆ ☆ ☆ ☆ 30分
★ ☆ ☆ ☆ 50分
```sql
......@@ -2136,14 +2056,6 @@ ORDER BY
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## ORDER BY 语句对多个不同条件使用不同方向的排序无法使用索引
* **Item:** CLA.007
......
......@@ -2098,7 +2098,7 @@ ORDER BY
# Query: 4ECCA9568BE69E68
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -2139,14 +2139,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -2157,7 +2149,7 @@ FROM
# Query: 485D56FC88BBBDB9
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -2198,14 +2190,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -2216,7 +2200,7 @@ FROM
# Query: 0D0DABACEDFF5765
★ ★ ★ ☆ ☆ 75分
★ ★ ★ ★ ☆ 95分
```sql
......@@ -2257,14 +2241,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -2431,7 +2407,7 @@ WHERE
# Query: 17D5BCF21DC2364C
★ ★ ★ ☆ ☆ 65分
★ ★ ★ ★ ☆ 85分
```sql
......@@ -2485,14 +2461,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -2615,7 +2583,7 @@ WHERE
# Query: 3FF20E28EC9CBEF9
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -2652,17 +2620,9 @@ FROM
* **Using where**: WHERE条件用于筛选出与下一个表匹配的数据然后返回给客户端. 除非故意做的全表扫描, 否则连接类型是ALL或者是index, 且在Extra列的值中没有Using Where, 则该查询可能是有问题的.
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
# Query: 5C547F08EADBB131
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -2699,17 +2659,9 @@ FROM
* **Using where**: WHERE条件用于筛选出与下一个表匹配的数据然后返回给客户端. 除非故意做的全表扫描, 否则连接类型是ALL或者是index, 且在Extra列的值中没有Using Where, 则该查询可能是有问题的.
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
# Query: AF0C1EB58B23D2FA
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -2746,17 +2698,9 @@ FROM
* **Using where**: WHERE条件用于筛选出与下一个表匹配的数据然后返回给客户端. 除非故意做的全表扫描, 否则连接类型是ALL或者是index, 且在Extra列的值中没有Using Where, 则该查询可能是有问题的.
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
# Query: 626571EAE84E2C8A
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -2800,14 +2744,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
# Query: 50F2AB4243CE2071
★ ★ ★ ☆ ☆ 60分
......@@ -2878,7 +2814,7 @@ FROM
# Query: 584CCEC8069B6947
☆ ☆ ☆ ☆ 30分
★ ☆ ☆ ☆ 50分
```sql
......@@ -2948,14 +2884,6 @@ ORDER BY
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 同一张表被连接两次
* **Item:** JOI.002
......@@ -3836,7 +3764,7 @@ LIMIT
# Query: 16CB4628D2597D40
★ ★ ★ ☆ ☆ 65分
★ ★ ★ ★ ☆ 85分
```sql
......@@ -3888,14 +3816,6 @@ FROM
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -3941,7 +3861,7 @@ GROUP BY
| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | *actor* | NULL | ref | idx\_actor\_last\_name | idx\_actor\_last\_name | 137 | const | 2 | 14.29% | O(log n) | Using where; Using temporary |
| 1 | SIMPLE | *actor* | NULL | ref | idx\_actor\_last\_name | idx\_actor\_last\_name | 137 | const | 2 | 25.00% | O(log n) | Using where; Using temporary |
......@@ -4087,7 +4007,7 @@ WHERE
# Query: 1E8B70E30062FD13
★ ★ ★ ★ ☆ 80分
★ ★ ★ ★ ★ 100分
```sql
......@@ -4123,17 +4043,9 @@ FROM
* **Using index**: 只需通过索引就可以从表中获取列的信息, 无需额外去读取真实的行数据. 如果查询使用的列值仅仅是一个简单索引的部分值, 则会使用这种策略来优化查询.
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
# Query: E48A20D0413512DA
☆ ☆ ☆ ☆ 20分
★ ☆ ☆ ☆ 40分
```sql
......@@ -4224,14 +4136,6 @@ ORDER BY
* **Content:** 在列或表别名(如"tbl AS alias")中, 明确使用 AS 关键字比隐含别名(如"tbl alias")更易懂。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## ORDER BY 语句对多个不同条件使用不同方向的排序无法使用索引
* **Item:** CLA.007
......@@ -4703,7 +4607,7 @@ create table hello. t (id int unsigned)
# Query: 291F95B7DCB74C21
★ ★ ★ ★ ☆ 95
☆ ☆ ☆ ☆ ☆ 0
```sql
......@@ -4715,6 +4619,10 @@ WHERE
data >= ''
```
## MySQL execute failed
Unknown column 'data' in 'where clause'
## 不建议使用 SELECT * 类型查询
* **Item:** COL.001
......@@ -4735,6 +4643,8 @@ DROP
DEFAULT
```
## OK
# Query: B48292EDB9D0E010
★ ★ ☆ ☆ ☆ 40分
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册