データベースインデックス

GORM では、index, uniqueIndex タグを使ってデータベースインデックスを作成できます。これらのインデックスは、GORM で AutoMigrate または CreateTable を実行したときに作成されます。

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

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

複合インデックス

2つのフィールドに同じインデックス名を使用すると、複合インデックスが作成されます。例:

// 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 を持つすべてのフィールドは、元のルールと同様に、同じインデックスにまとめられます。しかし、改善点として、最も派生した/埋め込まれた構造体が 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 はインデックス名を指定しない場合にのみ機能します。

複数のインデックス

1つのフィールドは、複数の index, uniqueIndex タグを受け入れ、フィールドに複数のインデックスを作成します。

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

プラチナスポンサー

ゴールドスポンサー

プラチナスポンサー

ゴールドスポンサー