未验证 提交 69e0a1f0 编写于 作者: martianzhang's avatar martianzhang 提交者: GitHub

Merge pull request #102 from wusphinx/refatorHardcode

IndexMaxLength refactor hard code
...@@ -29,6 +29,11 @@ import ( ...@@ -29,6 +29,11 @@ import (
"vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/sqlparser"
) )
const (
// IndexNameMaxLength Ref. https://dev.mysql.com/doc/refman/8.0/en/identifiers.html
IndexNameMaxLength = 64
)
// IndexAdvisor 索引建议需要使用到的所有信息 // IndexAdvisor 索引建议需要使用到的所有信息
type IndexAdvisor struct { type IndexAdvisor struct {
vEnv *env.VirtualEnv // 线下虚拟测试环境(测试环境) vEnv *env.VirtualEnv // 线下虚拟测试环境(测试环境)
...@@ -447,9 +452,9 @@ func (idxAdv *IndexAdvisor) idxColsTypeCheck(idxList []IndexInfo) []IndexInfo { ...@@ -447,9 +452,9 @@ func (idxAdv *IndexAdvisor) idxColsTypeCheck(idxList []IndexInfo) []IndexInfo {
} }
// 索引名称最大长度64 // 索引名称最大长度64
if len(idxName) > 64 { if len(idxName) > IndexNameMaxLength {
common.Log.Warn("index '%s' name large than 64", idxName) common.Log.Warn("index '%s' name large than IndexNameMaxLength", idxName)
idxName = strings.TrimRight(idxName[:64], "_") idxName = strings.TrimRight(idxName[:IndexNameMaxLength], "_")
} }
// 新的alter语句 // 新的alter语句
...@@ -557,10 +562,11 @@ func (idxAdv *IndexAdvisor) mergeIndexes(idxList []IndexInfo) []IndexInfo { ...@@ -557,10 +562,11 @@ func (idxAdv *IndexAdvisor) mergeIndexes(idxList []IndexInfo) []IndexInfo {
// 检测索引名称是否重复? // 检测索引名称是否重复?
if existedIndexes := indexMeta.FindIndex(database.IndexKeyName, idx.Name); len(existedIndexes) > 0 { if existedIndexes := indexMeta.FindIndex(database.IndexKeyName, idx.Name); len(existedIndexes) > 0 {
var newName string var newName string
if len(idx.Name) < 59 { idxSuffix := getRandomIndexSuffix()
newName = idx.Name + "_" + uniuri.New()[:4] if len(idx.Name) < IndexNameMaxLength-len(idxSuffix) {
newName = idx.Name + idxSuffix
} else { } 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) common.Log.Warning("duplicate index name '%s', new name is '%s'", idx.Name, newName)
...@@ -578,6 +584,11 @@ func (idxAdv *IndexAdvisor) mergeIndexes(idxList []IndexInfo) []IndexInfo { ...@@ -578,6 +584,11 @@ func (idxAdv *IndexAdvisor) mergeIndexes(idxList []IndexInfo) []IndexInfo {
return rmSelfDupIndex(indexes) return rmSelfDupIndex(indexes)
} }
// getRandomIndexSuffix format: _xxxx, length: 5
func getRandomIndexSuffix() string {
return fmt.Sprintf("_%s", uniuri.New()[:4])
}
// rmSelfDupIndex 去重传入的[]IndexInfo中重复的索引 // rmSelfDupIndex 去重传入的[]IndexInfo中重复的索引
func rmSelfDupIndex(indexes []IndexInfo) []IndexInfo { func rmSelfDupIndex(indexes []IndexInfo) []IndexInfo {
var resultIndex []IndexInfo var resultIndex []IndexInfo
...@@ -654,9 +665,9 @@ func (idxAdv *IndexAdvisor) buildIndex(idxList map[string]map[string][]*common.C ...@@ -654,9 +665,9 @@ func (idxAdv *IndexAdvisor) buildIndex(idxList map[string]map[string][]*common.C
idxName := "idx_" + strings.Join(colNames, "_") idxName := "idx_" + strings.Join(colNames, "_")
// 索引名称最大长度64 // 索引名称最大长度64
if len(idxName) > 64 { if len(idxName) > IndexNameMaxLength {
common.Log.Warn("index '%s' name large than 64", idxName) common.Log.Warn("index '%s' name large than IndexNameMaxLength", idxName)
idxName = strings.TrimRight(idxName[:64], "_") idxName = strings.TrimRight(idxName[:IndexNameMaxLength], "_")
} }
alterSQL := fmt.Sprintf("alter table `%s`.`%s` add index `%s` (`%s`)", idxAdv.vEnv.RealDB(db), tb, alterSQL := fmt.Sprintf("alter table `%s`.`%s` add index `%s` (`%s`)", idxAdv.vEnv.RealDB(db), tb,
......
...@@ -19,6 +19,7 @@ package advisor ...@@ -19,6 +19,7 @@ package advisor
import ( import (
"fmt" "fmt"
"os" "os"
"strings"
"testing" "testing"
"github.com/XiaoMi/soar/common" "github.com/XiaoMi/soar/common"
...@@ -464,3 +465,12 @@ func TestIdxColsTypeCheck(t *testing.T) { ...@@ -464,3 +465,12 @@ func TestIdxColsTypeCheck(t *testing.T) {
} }
} }
} }
func TestGetRandomIndexSuffix(t *testing.T) {
for i := 0; i < 5; i++ {
r := getRandomIndexSuffix()
if !(strings.HasPrefix(r, "_") && len(r) == 5) {
t.Errorf("getRandomIndexSuffix should return a string with prefix `_` and 5 length, but got:%s", r)
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册