高级主题

数据库索引

qianmoQqianmoQ· 更新于 2026-09-23· 阅读 7 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

GORM 允许使用标签 index、uniqueIndex 创建数据库索引,这些索引会在 AutoMigrate 或使用 GORM 创建表时被创建。

Index 标签

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)"`
}


type User struct {
  Name string `gorm:"index:,class:FULLTEXT,option:WITH PARSER ngram INVISIBLE"`
}


type User struct {
  Name string `gorm:"index:,option:CONCURRENTLY"`
}

uniqueIndex

标签 uniqueIndex 的用法与 index 类似,等同于 index:,unique

type User struct {
  Name1 string `gorm:"uniqueIndex"`
  Name2 string `gorm:"uniqueIndex:idx_name,sort:desc"`
}

请注意,此方式对唯一复合索引不起作用。

复合索引

对两个字段使用相同的索引名称将创建复合索引,例如:


type User struct {
  Name   string `gorm:"index:idx_member"`
  Number string `gorm:"index:idx_member"`
}

创建唯一复合索引:


type User struct {
  Name   string `gorm:"index:idx_member,unique"`
  Number string `gorm:"index:idx_member,unique"`
}

字段优先级

复合索引的列顺序对其性能有影响,因此必须谨慎选择

你可以使用 priority 选项指定顺序,默认优先级值为 10,如果优先级值相同,则顺序基于模型结构体的字段索引

type User struct {
  Name   string `gorm:"index:idx_member"`
  Number string `gorm:"index:idx_member"`
}


type User struct {
  Name   string `gorm:"index:idx_member,priority:2"`
  Number string `gorm:"index:idx_member,priority:1"`
}


type User struct {
  Name   string `gorm:"index:idx_member,priority:12"`
  Number string `gorm:"index:idx_member"`
}

共享复合索引

如果你通过内嵌结构体创建共享复合索引,则无法指定索引名称,因为多次内嵌该结构体会导致数据库中出现重复的索引名称。

在这种情况下,你可以使用索引标签 composite,它表示复合索引的 id。结构体中所有具有相同 composite id 的字段会被放到同一个索引中,就像原来的规则一样。但改进之处在于,它让最派生的/内嵌的结构体通过 NamingStrategy 生成索引名称。例如:

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_myname 和 idx_bar1_myname。

composite 仅在未指定索引名称时生效。

多个索引

一个字段可以接受多个 index、uniqueIndex 标签,从而在该字段上创建多个索引

type UserIndex struct {
  OID          int64  `gorm:"index:idx_id;index:idx_oid,unique"`
  MemberNumber string `gorm:"index:idx_id"`
}

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…