提交 87dbcaf3 编写于 作者: L liipx

fix #155

a new config arg 'min-cardinality' for index column selection
上级 1d52539d
...@@ -628,7 +628,6 @@ func (idxAdv *IndexAdvisor) buildJoinIndex(meta common.Meta) []IndexInfo { ...@@ -628,7 +628,6 @@ func (idxAdv *IndexAdvisor) buildJoinIndex(meta common.Meta) []IndexInfo {
indexColsList := make(map[string]map[string][]*common.Column) indexColsList := make(map[string]map[string][]*common.Column)
for _, col := range IndexCols { for _, col := range IndexCols {
mergeIndex(indexColsList, col) mergeIndex(indexColsList, col)
} }
if common.Config.TestDSN.Disable || common.Config.OnlineDSN.Disable { if common.Config.TestDSN.Disable || common.Config.OnlineDSN.Disable {
...@@ -723,6 +722,11 @@ func (idxAdv *IndexAdvisor) buildIndexWithNoEnv(indexList map[string]map[string] ...@@ -723,6 +722,11 @@ func (idxAdv *IndexAdvisor) buildIndexWithNoEnv(indexList map[string]map[string]
// mergeIndex 将索引用到的列去重后合并到一起 // mergeIndex 将索引用到的列去重后合并到一起
func mergeIndex(idxList map[string]map[string][]*common.Column, column *common.Column) { func mergeIndex(idxList map[string]map[string][]*common.Column, column *common.Column) {
// 散粒度低于阈值将不会添加索引
if common.Config.MinCardinality > column.Cardinality {
return
}
db := column.DB db := column.DB
tb := column.Table tb := column.Table
if idxList[db] == nil { if idxList[db] == nil {
......
...@@ -357,6 +357,7 @@ func TestRuleUpdatePrimaryKey(t *testing.T) { ...@@ -357,6 +357,7 @@ func TestRuleUpdatePrimaryKey(t *testing.T) {
func TestIndexAdvise(t *testing.T) { func TestIndexAdvise(t *testing.T) {
common.Log.Debug("Entering function: %s", common.GetFunctionName()) common.Log.Debug("Entering function: %s", common.GetFunctionName())
// common.Config.MinCardinality = 1
vEnv, rEnv := env.BuildEnv() vEnv, rEnv := env.BuildEnv()
defer vEnv.CleanUp() defer vEnv.CleanUp()
...@@ -377,7 +378,7 @@ func TestIndexAdvise(t *testing.T) { ...@@ -377,7 +378,7 @@ func TestIndexAdvise(t *testing.T) {
if idxAdvisor != nil { if idxAdvisor != nil {
rule := idxAdvisor.IndexAdvise().Format() rule := idxAdvisor.IndexAdvise().Format()
if len(rule) > 0 { if len(rule) > 0 {
pretty.Println(rule) _, _ = pretty.Println(rule)
} }
} }
} }
......
...@@ -110,6 +110,7 @@ type Configuration struct { ...@@ -110,6 +110,7 @@ type Configuration struct {
MaxSubqueryDepth int `yaml:"max-subquery-depth"` // 子查询最大尝试 MaxSubqueryDepth int `yaml:"max-subquery-depth"` // 子查询最大尝试
MaxVarcharLength int `yaml:"max-varchar-length"` // varchar最大长度 MaxVarcharLength int `yaml:"max-varchar-length"` // varchar最大长度
ColumnNotAllowType []string `yaml:"column-not-allow-type"` // 字段不允许使用的数据类型 ColumnNotAllowType []string `yaml:"column-not-allow-type"` // 字段不允许使用的数据类型
MinCardinality float64 `yaml:"min-cardinality"` // 添加索引散粒度阈值,范围 0~100
// ++++++++++++++EXPLAIN检查项+++++++++++++ // ++++++++++++++EXPLAIN检查项+++++++++++++
ExplainSQLReportType string `yaml:"explain-sql-report-type"` // EXPLAIN markdown 格式输出 SQL 样式,支持 sample, fingerprint, pretty 等 ExplainSQLReportType string `yaml:"explain-sql-report-type"` // EXPLAIN markdown 格式输出 SQL 样式,支持 sample, fingerprint, pretty 等
...@@ -163,6 +164,7 @@ var Config = &Configuration{ ...@@ -163,6 +164,7 @@ var Config = &Configuration{
ConnTimeOut: 3, ConnTimeOut: 3,
QueryTimeOut: 30, QueryTimeOut: 30,
Delimiter: ";", Delimiter: ";",
MinCardinality: 0,
MaxJoinTableCount: 5, MaxJoinTableCount: 5,
MaxGroupByColsCount: 5, MaxGroupByColsCount: 5,
...@@ -512,6 +514,7 @@ func readCmdFlags() error { ...@@ -512,6 +514,7 @@ func readCmdFlags() error {
connTimeOut := flag.Int("conn-time-out", Config.ConnTimeOut, "ConnTimeOut, 数据库连接超时时间,单位秒") connTimeOut := flag.Int("conn-time-out", Config.ConnTimeOut, "ConnTimeOut, 数据库连接超时时间,单位秒")
queryTimeOut := flag.Int("query-time-out", Config.QueryTimeOut, "QueryTimeOut, 数据库SQL执行超时时间,单位秒") queryTimeOut := flag.Int("query-time-out", Config.QueryTimeOut, "QueryTimeOut, 数据库SQL执行超时时间,单位秒")
delimiter := flag.String("delimiter", Config.Delimiter, "Delimiter, SQL分隔符") delimiter := flag.String("delimiter", Config.Delimiter, "Delimiter, SQL分隔符")
minCardinality := flag.Float64("min-cardinality", Config.MinCardinality, "MinCardinality,索引列散粒度最低阈值,散粒度低于该值的列不添加索引,建议范围0.0 ~ 100.0")
// +++++++++++++++日志相关+++++++++++++++++ // +++++++++++++++日志相关+++++++++++++++++
logLevel := flag.Int("log-level", Config.LogLevel, "LogLevel, 日志级别, [0:Emergency, 1:Alert, 2:Critical, 3:Error, 4:Warning, 5:Notice, 6:Informational, 7:Debug]") logLevel := flag.Int("log-level", Config.LogLevel, "LogLevel, 日志级别, [0:Emergency, 1:Alert, 2:Critical, 3:Error, 4:Warning, 5:Notice, 6:Informational, 7:Debug]")
logOutput := flag.String("log-output", Config.LogOutput, "LogOutput, 日志输出位置") logOutput := flag.String("log-output", Config.LogOutput, "LogOutput, 日志输出位置")
...@@ -612,6 +615,7 @@ func readCmdFlags() error { ...@@ -612,6 +615,7 @@ func readCmdFlags() error {
Config.IgnoreRules = strings.Split(*ignoreRules, ",") Config.IgnoreRules = strings.Split(*ignoreRules, ",")
Config.RewriteRules = strings.Split(*rewriteRules, ",") Config.RewriteRules = strings.Split(*rewriteRules, ",")
*blackList = strings.TrimSpace(*blackList) *blackList = strings.TrimSpace(*blackList)
Config.MinCardinality = *minCardinality
if filepath.IsAbs(*blackList) || *blackList == "" { if filepath.IsAbs(*blackList) || *blackList == "" {
Config.BlackList = *blackList Config.BlackList = *blackList
......
...@@ -71,6 +71,7 @@ max-subquery-depth: 5 ...@@ -71,6 +71,7 @@ max-subquery-depth: 5
max-varchar-length: 1024 max-varchar-length: 1024
column-not-allow-type: column-not-allow-type:
- boolean - boolean
min-cardinality: 0
explain-sql-report-type: pretty explain-sql-report-type: pretty
explain-type: extended explain-type: extended
explain-format: traditional explain-format: traditional
......
...@@ -167,44 +167,44 @@ ...@@ -167,44 +167,44 @@
{ {
"checksumSHA1": "fWqL/7jTYOiqDNmiUcQi3u45Hw0=", "checksumSHA1": "fWqL/7jTYOiqDNmiUcQi3u45Hw0=",
"path": "github.com/pingcap/tidb/sessionctx/stmtctx", "path": "github.com/pingcap/tidb/sessionctx/stmtctx",
"revision": "9f51a626e6587118db4306882a5578e7ffe3d2a6", "revision": "4ccd7456fcdc5e62e68f49a0a542cbcf88e38343",
"revisionTime": "2018-12-13T05:17:24Z" "revisionTime": "2018-12-13T09:52:39Z"
}, },
{ {
"checksumSHA1": "0CCq+3fAyaXs9XU+xWaRvbbtSOQ=", "checksumSHA1": "0CCq+3fAyaXs9XU+xWaRvbbtSOQ=",
"path": "github.com/pingcap/tidb/types", "path": "github.com/pingcap/tidb/types",
"revision": "9f51a626e6587118db4306882a5578e7ffe3d2a6", "revision": "4ccd7456fcdc5e62e68f49a0a542cbcf88e38343",
"revisionTime": "2018-12-13T05:17:24Z" "revisionTime": "2018-12-13T09:52:39Z"
}, },
{ {
"checksumSHA1": "DWVD7+ygtT66IQ+cqXmMJ5OVqUk=", "checksumSHA1": "DWVD7+ygtT66IQ+cqXmMJ5OVqUk=",
"path": "github.com/pingcap/tidb/types/json", "path": "github.com/pingcap/tidb/types/json",
"revision": "9f51a626e6587118db4306882a5578e7ffe3d2a6", "revision": "4ccd7456fcdc5e62e68f49a0a542cbcf88e38343",
"revisionTime": "2018-12-13T05:17:24Z" "revisionTime": "2018-12-13T09:52:39Z"
}, },
{ {
"checksumSHA1": "Zp5ME8OXNTmHnYTwJJUZlydN4/U=", "checksumSHA1": "Zp5ME8OXNTmHnYTwJJUZlydN4/U=",
"path": "github.com/pingcap/tidb/types/parser_driver", "path": "github.com/pingcap/tidb/types/parser_driver",
"revision": "9f51a626e6587118db4306882a5578e7ffe3d2a6", "revision": "4ccd7456fcdc5e62e68f49a0a542cbcf88e38343",
"revisionTime": "2018-12-13T05:17:24Z" "revisionTime": "2018-12-13T09:52:39Z"
}, },
{ {
"checksumSHA1": "s709bhSrG2Ec35406mGtrySid4s=", "checksumSHA1": "s709bhSrG2Ec35406mGtrySid4s=",
"path": "github.com/pingcap/tidb/util/execdetails", "path": "github.com/pingcap/tidb/util/execdetails",
"revision": "9f51a626e6587118db4306882a5578e7ffe3d2a6", "revision": "4ccd7456fcdc5e62e68f49a0a542cbcf88e38343",
"revisionTime": "2018-12-13T05:17:24Z" "revisionTime": "2018-12-13T09:52:39Z"
}, },
{ {
"checksumSHA1": "nUC7zVoAMNR2a+z2iGqHoN2AkFE=", "checksumSHA1": "nUC7zVoAMNR2a+z2iGqHoN2AkFE=",
"path": "github.com/pingcap/tidb/util/hack", "path": "github.com/pingcap/tidb/util/hack",
"revision": "9f51a626e6587118db4306882a5578e7ffe3d2a6", "revision": "4ccd7456fcdc5e62e68f49a0a542cbcf88e38343",
"revisionTime": "2018-12-13T05:17:24Z" "revisionTime": "2018-12-13T09:52:39Z"
}, },
{ {
"checksumSHA1": "xSyepiuqsoaaeDch7cXeumvVHKM=", "checksumSHA1": "xSyepiuqsoaaeDch7cXeumvVHKM=",
"path": "github.com/pingcap/tidb/util/memory", "path": "github.com/pingcap/tidb/util/memory",
"revision": "9f51a626e6587118db4306882a5578e7ffe3d2a6", "revision": "4ccd7456fcdc5e62e68f49a0a542cbcf88e38343",
"revisionTime": "2018-12-13T05:17:24Z" "revisionTime": "2018-12-13T09:52:39Z"
}, },
{ {
"checksumSHA1": "SmYeIK/fIYXNu8IKxD6HOVQVTuU=", "checksumSHA1": "SmYeIK/fIYXNu8IKxD6HOVQVTuU=",
...@@ -401,62 +401,62 @@ ...@@ -401,62 +401,62 @@
{ {
"checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=", "checksumSHA1": "aKn1oKcY74N8TRLm3Ayt7Q4bbI4=",
"path": "vitess.io/vitess/go/bytes2", "path": "vitess.io/vitess/go/bytes2",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=", "checksumSHA1": "JVCEN4UGRmg3TofIBdzZMZ3G0Ww=",
"path": "vitess.io/vitess/go/hack", "path": "vitess.io/vitess/go/hack",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "e1WJ7vCnVrlQQQlc6n/FewCDMso=", "checksumSHA1": "e1WJ7vCnVrlQQQlc6n/FewCDMso=",
"path": "vitess.io/vitess/go/sqltypes", "path": "vitess.io/vitess/go/sqltypes",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=", "checksumSHA1": "ntFIQYkBS51G6y+FEkjFW40+HOU=",
"path": "vitess.io/vitess/go/vt/log", "path": "vitess.io/vitess/go/vt/log",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "tPQFPwbMdjuX0qjNl4Zl8zc37JQ=", "checksumSHA1": "tPQFPwbMdjuX0qjNl4Zl8zc37JQ=",
"path": "vitess.io/vitess/go/vt/proto/query", "path": "vitess.io/vitess/go/vt/proto/query",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "o0tR/c7lgr0pLkxk7CdvjiNDAKU=", "checksumSHA1": "o0tR/c7lgr0pLkxk7CdvjiNDAKU=",
"path": "vitess.io/vitess/go/vt/proto/topodata", "path": "vitess.io/vitess/go/vt/proto/topodata",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "77UojBqi0yyeQvR70j7C3kcKclQ=", "checksumSHA1": "77UojBqi0yyeQvR70j7C3kcKclQ=",
"path": "vitess.io/vitess/go/vt/proto/vtgate", "path": "vitess.io/vitess/go/vt/proto/vtgate",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "QpWGhoVDwM+8+sgYLI/YU+95iGU=", "checksumSHA1": "QpWGhoVDwM+8+sgYLI/YU+95iGU=",
"path": "vitess.io/vitess/go/vt/proto/vtrpc", "path": "vitess.io/vitess/go/vt/proto/vtrpc",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "lENrUY/YyxwYFHYN+21TBH92P3U=", "checksumSHA1": "lENrUY/YyxwYFHYN+21TBH92P3U=",
"path": "vitess.io/vitess/go/vt/sqlparser", "path": "vitess.io/vitess/go/vt/sqlparser",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
}, },
{ {
"checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=", "checksumSHA1": "oF4XzuOzwvj1iduX/lYqNSyY/HM=",
"path": "vitess.io/vitess/go/vt/vterrors", "path": "vitess.io/vitess/go/vt/vterrors",
"revision": "84a3524002899f761096c454e02924774c61d6ee", "revision": "eb5a5e0e435db30856600b794d8cff235fdf24b7",
"revisionTime": "2018-12-12T17:00:54Z" "revisionTime": "2018-12-13T22:28:01Z"
} }
], ],
"rootPath": "github.com/XiaoMi/soar" "rootPath": "github.com/XiaoMi/soar"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册