GORM 允许通过 indexuniqueIndex 标签创建索引,这些索引将在使用 GORM 进行AutoMigrate 或 Createtable 时创建

索引标签

GORM 可以接受很多的索引设置,例如:classtypewherecommentexpressionsortcollate

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

  1. type User struct {
  2. Name string `gorm:"index"`
  3. Name2 string `gorm:"index:idx_name,unique"`
  4. Name3 string `gorm:"index:,sort:desc,collate:utf8,type:btree,length:10,where:name3 != 'jinzhu'"`
  5. Name4 string `gorm:"uniqueIndex"`
  6. Age int64 `gorm:"index:,class:FULLTEXT,comment:hello \\, world,where:age > 10"`
  7. Age2 int64 `gorm:"index:,expression:ABS(age)"`
  8. }

唯一索引

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

  1. type User struct {
  2. Name1 string `gorm:"uniqueIndex"`
  3. Name2 string `gorm:"uniqueIndex:idx_name,sort:desc"`
  4. }

复合索引

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

  1. type User struct {
  2. Name string `gorm:"index:idx_member"`
  3. Number string `gorm:"index:idx_member"`
  4. }

字段优先级

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

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

  1. type User struct {
  2. Name string `gorm:"index:idx_member"`
  3. Number string `gorm:"index:idx_member"`
  4. }
  5. // column order: name, number
  6. type User struct {
  7. Name string `gorm:"index:idx_member,priority:2"`
  8. Number string `gorm:"index:idx_member,priority:1"`
  9. }
  10. // column order: number, name
  11. type User struct {
  12. Name string `gorm:"index:idx_member,priority:12"`
  13. Number string `gorm:"index:idx_member"`
  14. }
  15. // column order: number, name

多索引

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

  1. type UserIndex struct {
  2. OID int64 `gorm:"index:idx_id;index:idx_oid,unique"`
  3. MemberNumber string `gorm:"index:idx_id"`
  4. }