diff --git a/advisor/heuristic.go b/advisor/heuristic.go index ac822a2d0fb7bf1b22c56c32318a1d4dd2ab1052..c999ffd9d0f58f02e929548b375f12df693ace7a 100644 --- a/advisor/heuristic.go +++ b/advisor/heuristic.go @@ -2044,6 +2044,7 @@ func (q *Query4Audit) RuleSpaceWithQuote() Rule { } // RuleHint ARG.010 +// TODO: sql_no_cache, straight join func (q *Query4Audit) RuleHint() Rule { var rule = q.RuleOK() err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { diff --git a/advisor/heuristic_test.go b/advisor/heuristic_test.go index 7366c452e2bdba8507f5cabf05bcb848df674560..be14632c888bc3dc6661da719a9cda7459e29678 100644 --- a/advisor/heuristic_test.go +++ b/advisor/heuristic_test.go @@ -1731,7 +1731,7 @@ func TestRuleHint(t *testing.T) { { `SELECT * FROM t1 USE INDEX (i1) ORDER BY a;`, `SELECT * FROM t1 IGNORE INDEX (i1) ORDER BY (i2);`, - // vitess syntax not support now + // TODO: vitess syntax not support now // `SELECT * FROM t1 USE INDEX (i1,i2) IGNORE INDEX (i2);`, // `SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);`, }, diff --git a/advisor/rules.go b/advisor/rules.go index 97a60e8e999825c6e1887e6efb558a53884fa543..3190bea76c4c76f7cbd07cfdae07686c2a83fdc3 100644 --- a/advisor/rules.go +++ b/advisor/rules.go @@ -251,9 +251,9 @@ func init() { "ARG.010": { Item: "ARG.010", Severity: "L1", - Summary: "不要使用hint,如sql_no_cache,force index,ignore key,straight join等", + Summary: "不要使用hint,如sql_no_cache, force index, ignore key, straight join等", Content: `hint是用来强制SQL按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。`, - Case: "SELECT 'abc '", + Case: "SELECT * FROM t1 USE INDEX (i1) ORDER BY a;", Func: (*Query4Audit).RuleHint, }, "ARG.011": { diff --git a/advisor/testdata/TestListHeuristicRules.golden b/advisor/testdata/TestListHeuristicRules.golden index 1e93d48a4239eb7fc66f3418c9b9ddf8e4f8be0c..c9cfef4513af2dcd575ec625c2f4333a30b77334 100644 --- a/advisor/testdata/TestListHeuristicRules.golden +++ b/advisor/testdata/TestListHeuristicRules.golden @@ -162,7 +162,7 @@ SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17 ```sql SELECT 'abc ' ``` -## 不要使用hint,如sql\_no\_cache,force index,ignore key,straight join等 +## 不要使用hint,如sql\_no\_cache, force index, ignore key, straight join等 * **Item**:ARG.010 * **Severity**:L1 @@ -170,7 +170,7 @@ SELECT 'abc ' * **Case**: ```sql -SELECT 'abc ' +SELECT * FROM t1 USE INDEX (i1) ORDER BY a; ``` ## 不要使用负向查询,如:NOT IN/NOT LIKE diff --git a/advisor/testdata/TestMergeConflictHeuristicRules.golden b/advisor/testdata/TestMergeConflictHeuristicRules.golden index 9023265545b051ada7936e4a5b6829237f96d7d7..47233e53c245b7caa9138eb8f32588f5f12ae6e7 100644 --- a/advisor/testdata/TestMergeConflictHeuristicRules.golden +++ b/advisor/testdata/TestMergeConflictHeuristicRules.golden @@ -13,7 +13,7 @@ advisor.Rule{Item:"ARG.006", Severity:"L1", Summary:"应尽量避免在WHERE子 advisor.Rule{Item:"ARG.007", Severity:"L3", Summary:"避免使用模式匹配", Content:"性能问题是使用模式匹配操作符的最大缺点。使用LIKE或正则表达式进行模式匹配进行查询的另一个问题,是可能会返回意料之外的结果。最好的方案就是使用特殊的搜索引擎技术来替代SQL,比如Apache Lucene。另一个可选方案是将结果保存起来从而减少重复的搜索开销。如果一定要使用SQL,请考虑在MySQL中使用像FULLTEXT索引这样的第三方扩展。但更广泛地说,您不一定要使用SQL来解决所有问题。", Case:"select c_id,c2,c3 from tbl where c2 like 'test%'", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"ARG.008", Severity:"L1", Summary:"OR查询索引列时请尽量使用IN谓词", Content:"IN-list谓词可以用于索引检索,并且优化器可以对IN-list进行排序,以匹配索引的排序序列,从而获得更有效的检索。请注意,IN-list必须只包含常量,或在查询块执行期间保持常量的值,例如外引用。", Case:"SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"ARG.009", Severity:"L1", Summary:"引号中的字符串开头或结尾包含空格", Content:"如果VARCHAR列的前后存在空格将可能引起逻辑问题,如在MySQL 5.5中'a'和'a '可能会在查询中被认为是相同的值。", Case:"SELECT 'abc '", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} -advisor.Rule{Item:"ARG.010", Severity:"L1", Summary:"不要使用hint,如sql_no_cache,force index,ignore key,straight join等", Content:"hint是用来强制SQL按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。", Case:"SELECT 'abc '", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} +advisor.Rule{Item:"ARG.010", Severity:"L1", Summary:"不要使用hint,如sql_no_cache, force index, ignore key, straight join等", Content:"hint是用来强制SQL按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。", Case:"SELECT * FROM t1 USE INDEX (i1) ORDER BY a;", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"ARG.011", Severity:"L3", Summary:"不要使用负向查询,如:NOT IN/NOT LIKE", Content:"请尽量不要使用负向查询,这将导致全表扫描,对查询性能影响较大。", Case:"select id from t where num not in(1,2,3);", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"CLA.001", Severity:"L4", Summary:"最外层SELECT未指定WHERE条件", Content:"SELECT语句没有WHERE子句,可能检查比预期更多的行(全表扫描)。对于SELECT COUNT(*)类型的请求如果不要求精度,建议使用SHOW TABLE STATUS或EXPLAIN替代。", Case:"select id from tbl", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} advisor.Rule{Item:"CLA.002", Severity:"L3", Summary:"不建议使用ORDER BY RAND()", Content:"ORDER BY RAND()是从结果集中检索随机行的一种非常低效的方法,因为它会对整个结果进行排序并丢弃其大部分数据。", Case:"select name from tbl where id < 1000 order by rand(number)", Position:0, Func:func(*advisor.Query4Audit) advisor.Rule {...}} diff --git a/doc/heuristic.md b/doc/heuristic.md index 1e93d48a4239eb7fc66f3418c9b9ddf8e4f8be0c..c9cfef4513af2dcd575ec625c2f4333a30b77334 100644 --- a/doc/heuristic.md +++ b/doc/heuristic.md @@ -162,7 +162,7 @@ SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17 ```sql SELECT 'abc ' ``` -## 不要使用hint,如sql\_no\_cache,force index,ignore key,straight join等 +## 不要使用hint,如sql\_no\_cache, force index, ignore key, straight join等 * **Item**:ARG.010 * **Severity**:L1 @@ -170,7 +170,7 @@ SELECT 'abc ' * **Case**: ```sql -SELECT 'abc ' +SELECT * FROM t1 USE INDEX (i1) ORDER BY a; ``` ## 不要使用负向查询,如:NOT IN/NOT LIKE diff --git a/retool-install.sh b/retool-install.sh index 23e441e3f4ba7a771f882a94fb2fbc90a31c45a5..877ef91ef5598ecdcb9d3f84f94b5c9041888648 100755 --- a/retool-install.sh +++ b/retool-install.sh @@ -6,7 +6,7 @@ set -euo pipefail which retool >/dev/null || go get -u github.com/twitchtv/retool # This tool can run other checks in a standardized way -retool add gopkg.in/alecthomas/gometalinter.v2 v2.0.5 +retool add gopkg.in/alecthomas/gometalinter.v2 v2.0.11 # check spelling # misspell works with gometalinter diff --git a/vendor/vendor.json b/vendor/vendor.json index d9d7d9323a53ec75109d0e2476f4c3ef00381e05..b0537c0078b7b70ff41cca82b0746b17b7c0fd91 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -1016,68 +1016,68 @@ { "checksumSHA1": "w8FCRjH70gM6QttB9QrEh9Y1x64=", "path": "vitess.io/vitess", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=", "path": "vitess.io/vitess/go/bytes2", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=", "path": "vitess.io/vitess/go/hack", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "L7ROM3XZyVXSD799Isv3bcFFhuQ=", "path": "vitess.io/vitess/go/sqltypes", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=", "path": "vitess.io/vitess/go/vt/log", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "+AyVYXW7XGu+R8AUNU0YY8DcE8k=", "path": "vitess.io/vitess/go/vt/proto/query", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "OnWsUHLDKcO3spwH0jD55SvKD24=", "path": "vitess.io/vitess/go/vt/proto/topodata", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "jUgYgOnOM36Zs1GMRVV+vG1hfnw=", "path": "vitess.io/vitess/go/vt/proto/vtgate", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "pLWM+SPGZs3k+IhjktE/cGUlpM0=", "path": "vitess.io/vitess/go/vt/proto/vtrpc", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "LDXjimRADIzASesUnWUOJ6smswg=", "path": "vitess.io/vitess/go/vt/sqlparser", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" }, { "checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=", "path": "vitess.io/vitess/go/vt/vterrors", - "revision": "137eb27a9c3a1789055e90ec1cf5f05bdc001d0c", - "revisionTime": "2018-10-21T20:32:27Z" + "revision": "44180fbce377cb4836348bb7880caa38808af817", + "revisionTime": "2018-10-22T18:04:59Z" } ], "rootPath": "github.com/XiaoMi/soar"