資料庫索引

GORM 允許使用標籤 indexuniqueIndex 建立資料庫索引,這些索引會在 使用 GORM 進行自動遷移或建立資料表 時建立。

索引標籤

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

標籤 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"`
}

白金贊助商

黃金贊助商

白金贊助商

黃金贊助商