教程 > gorm 教程 > 阅读:257

gorm 数据库索引——迹忆客-ag捕鱼王app官网

gorm 允许通过 indexuniqueindex 标签创建索引,这些索引将在使用 gorm 进行 automigratecreatetable 时创建

索引标签

gorm 可以接受很多索引设置,例如 class、type、where、comment、expression、sort、collate、option

下面的示例演示了如何使用它:

type user struct {
    name  string `gorm:"index"`
    name2 string `gorm:"index:idx_name,unique"`
    name3 string `gorm:"index:,sort:desc,collate:utf8,type:btree,length:10,where:name3 != 'jinzhu'"`
    name4 string `gorm:"uniqueindex"`
    age   int64  `gorm:"index:,class:fulltext,comment:hello \\, world,where:age > 10"`
    age2  int64  `gorm:"index:,expression:abs(age)"`
}
// mysql 选项
type user struct {
    name string `gorm:"index:,class:fulltext,option:with parser ngram invisible"`
}
// postgresql 选项
type user struct {
    name string `gorm:"index:,option:concurrently"`
}

唯一索引

uniqueindex 标签的作用与 index 类似,它等效于 index:,unique

type user struct {
    name1 string `gorm:"uniqueindex"`
    name2 string `gorm:"uniqueindex:idx_name,sort:desc"`
}

复合索引

两个字段使用同一个索引名将创建复合索引,例如:

// create composite index `idx_member` with columns `name`, `number`
type user struct {
    name   string `gorm:"index:idx_member"`
    number string `gorm:"index:idx_member"`
}

字段优先级

复合索引列的顺序会影响其性能,因此必须仔细考虑

我们可以使用 priority 指定顺序,默认优先级值是 10,如果优先级值相同,则顺序取决于模型结构体字段的顺序

type user struct {
    name   string `gorm:"index:idx_member"`
    number string `gorm:"index:idx_member"`
}
// column order: name, number
type user struct {
    name   string `gorm:"index:idx_member,priority:2"`
    number string `gorm:"index:idx_member,priority:1"`
}
// column order: number, name
type user struct {
    name   string `gorm:"index:idx_member,priority:12"`
    number string `gorm:"index:idx_member"`
}
// column order: number, name

共享复合索引

如果我们正在创建带有嵌入结构的共享复合索引,我们不能指定索引名称。 作为嵌入结构不止一次会导致重复的索引名称在 db。

在这种情况下,我们可以使用索引标签 composite, 它意味着复合索引的id。 所有具有相同结构复合id的字段都与原始规则一样,被合并到相同的索引中。 但改进使得最受影响/嵌入结构能够通过命名策略生成索引名称。 例如:

type foo struct {
  indexa int `gorm:"index:,unique,composite:myname"`
  indexb int `gorm:"index:,unique,composite:myname"`
}

如果表foo被创建,复合索引的名称将是 idx_foo_myname。

type bar0 struct {
  foo
}
type bar1 struct {
  foo
}

复合索引的名称分别是 idx_bar0_mynameidx_bar1_myname

复合 只能在指定索引名称时使用。


多索引

一个字段接受多个 indexuniqueindex 标签,这会在一个字段上创建多个索引

type userindex struct {
    oid          int64  `gorm:"index:idx_id;index:idx_oid,unique"`
    membernumber string `gorm:"index:idx_id"`
}

查看笔记

扫码一下
查看教程更方便
网站地图