From a4cb6f954a5c3431063175a8d2a84dd4c7b377b7 Mon Sep 17 00:00:00 2001 From: "wu.sphinx" Date: Wed, 14 Nov 2018 21:09:51 +0800 Subject: [PATCH] refactor --- advisor/index.go | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/advisor/index.go b/advisor/index.go index 9a3eb20..0e74f87 100644 --- a/advisor/index.go +++ b/advisor/index.go @@ -29,6 +29,11 @@ import ( "vitess.io/vitess/go/vt/sqlparser" ) +const ( + // https://dev.mysql.com/doc/refman/8.0/en/identifiers.html + IndexNameMaxLength = 64 +) + // IndexAdvisor 索引建议需要使用到的所有信息 type IndexAdvisor struct { vEnv *env.VirtualEnv // 线下虚拟测试环境(测试环境) @@ -447,9 +452,9 @@ func (idxAdv *IndexAdvisor) idxColsTypeCheck(idxList []IndexInfo) []IndexInfo { } // 索引名称最大长度64 - if len(idxName) > 64 { - common.Log.Warn("index '%s' name large than 64", idxName) - idxName = strings.TrimRight(idxName[:64], "_") + if len(idxName) > IndexNameMaxLength { + common.Log.Warn("index '%s' name large than IndexNameMaxLength", idxName) + idxName = strings.TrimRight(idxName[:IndexNameMaxLength], "_") } // 新的alter语句 @@ -557,10 +562,11 @@ func (idxAdv *IndexAdvisor) mergeIndexes(idxList []IndexInfo) []IndexInfo { // 检测索引名称是否重复? if existedIndexes := indexMeta.FindIndex(database.IndexKeyName, idx.Name); len(existedIndexes) > 0 { var newName string - if len(idx.Name) < 59 { - newName = idx.Name + "_" + uniuri.New()[:4] + idxSuffix := getIndexNameSuffix() + if len(idx.Name) < IndexNameMaxLength-len(idxSuffix) { + newName = idx.Name + idxSuffix } else { - newName = idx.Name[:59] + "_" + uniuri.New()[:4] + newName = idx.Name[:IndexNameMaxLength-len(idxSuffix)] + idxSuffix } common.Log.Warning("duplicate index name '%s', new name is '%s'", idx.Name, newName) @@ -578,6 +584,10 @@ func (idxAdv *IndexAdvisor) mergeIndexes(idxList []IndexInfo) []IndexInfo { return rmSelfDupIndex(indexes) } +func getIndexNameSuffix() string { + return fmt.Sprintf("_%s", uniuri.New()[:4]) +} + // rmSelfDupIndex 去重传入的[]IndexInfo中重复的索引 func rmSelfDupIndex(indexes []IndexInfo) []IndexInfo { var resultIndex []IndexInfo @@ -654,9 +664,9 @@ func (idxAdv *IndexAdvisor) buildIndex(idxList map[string]map[string][]*common.C idxName := "idx_" + strings.Join(colNames, "_") // 索引名称最大长度64 - if len(idxName) > 64 { - common.Log.Warn("index '%s' name large than 64", idxName) - idxName = strings.TrimRight(idxName[:64], "_") + if len(idxName) > IndexNameMaxLength { + common.Log.Warn("index '%s' name large than IndexNameMaxLength", idxName) + idxName = strings.TrimRight(idxName[:IndexNameMaxLength], "_") } alterSQL := fmt.Sprintf("alter table `%s`.`%s` add index `%s` (`%s`)", idxAdv.vEnv.RealDB(db), tb, -- GitLab