数据库索引

GORM 允许使用标签 indexuniqueIndex 创建数据库索引,这些索引将在 使用 GORM 进行 AutoMigrate 或 CreateTable 时创建

索引标签

GORM 接受许多索引设置,例如 classtypewherecommentexpressionsortcollateoption

查看以下示例以了解如何使用它

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 option
type User struct {
Name string `gorm:"index:,class:FULLTEXT,option:WITH PARSER ngram INVISIBLE"`
}

// PostgreSQL option
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

共享复合索引

如果您要使用嵌入式结构体创建共享复合索引,则不能指定索引名称,因为多次嵌入结构体会导致数据库中出现重复的索引名称。

在这种情况下,您可以使用索引标签 composite,它表示复合索引的 ID。所有具有相同结构体复合 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_mynameidx_bar1_myname

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

多个索引

一个字段接受多个 indexuniqueIndex 标签,这些标签将在一个字段上创建多个索引

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

铂金赞助商

黄金赞助商

铂金赞助商

黄金赞助商