シャーディングプラグインは、巨大なテーブルを小さいテーブルに分割し、シャーディングテーブルにクエリをリダイレクトするために、SQLパーサーを使用してクエリを置き換えます。 高パフォーマンスなデータベースアクセスが可能となります。
https://github.com/go-gorm/sharding
特徴
シンプルなデザイン。 プラグインをロードして設定を指定するだけで使用できます。
高速な動作。 Goと同じくらい速く、ネットワークに依存しないミドルウェア。
Multiple database (PostgreSQL, MySQL) support.
Integrated primary key generator (Snowflake, PostgreSQL Sequence, Custom, …).
使用方法 シャーディングミドルウェアを設定し、シャーディング対象のテーブルを登録します。 See Godoc for config details.
import ( "fmt" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/sharding" ) db, err := gorm.Open(postgres.New(postgres.Config{DSN: "postgres://localhost:5432/sharding-db?sslmode=disable" )) db.Use(sharding.Register(sharding.Config{ ShardingKey: "user_id" , NumberOfShards: 64 , PrimaryKeyGenerator: sharding.PKSnowflake, }, "orders" , Notification{}, AuditLog{}))
通常通りdbセッションを使用します。 シャーディング対象のテーブルを操作する場合は、クエリに Sharding Key
を持つ必要があることに注意してください。
db.Create(&Order{UserID: 2 }) db.Exec("INSERT INTO orders(user_id) VALUES(?)" , int64 (3 )) db.Create(&Order{Amount: 10 , ProductID: 100 }) fmt.Println(err) var orders []Orderdb.Model(&Order{}).Where("user_id" , int64 (2 )).Find(&orders) fmt.Printf("%#v\n" , orders) db.Raw("SELECT * FROM orders WHERE user_id = ?" , int64 (3 )).Scan(&orders) fmt.Printf("%#v\n" , orders) err = db.Model(&Order{}).Where("product_id" , "1" ).Find(&orders).Error fmt.Println(err) db.Exec("UPDATE orders SET product_id = ? WHERE user_id = ?" , 2 , int64 (3 )) err = db.Exec("DELETE FROM orders WHERE product_id = 3" ).Error fmt.Println(err)
より詳細な例は こちら にあります。