ホームページ  >  記事  >  バックエンド開発  >  Golang はページングを実装します

Golang はページングを実装します

WBOY
WBOYオリジナル
2023-05-22 12:12:071724ブラウズ

インターネット技術の発展とデータ量の増加に伴い、データに対するページング クエリがますます一般的になってきています。 golang では、ページングクエリはそれほど面倒ではなく、いくつかの最適化によってページングの効率を向上させることができます。

1. 基本的なページング

golang では、クエリをページングする最も基本的な方法は、SQL ステートメントで limit 句を使用することです。例:

SELECT * FROM table LIMIT offset, limit;

このうち、offset はオフセットを表し、limit は返されるレコードの数を表します。たとえば、各ページに 10 個のデータが表示される場合、1 ページ目の SQL ステートメントは

SELECT * FROM table LIMIT 0, 10;

となります。 2 ページ目の SQL ステートメントは

SELECT * FROM table LIMIT 10, 10;

になります。この方法では手動で計算する必要があります。各ページのオフセットの量を測定して記録するのは面倒で、間違いが発生しやすくなります。したがって、いくつかのライブラリを使用して、ページ分割されたクエリの実装を簡素化できます。

2. gorm ライブラリを使用してページングを実装する

gorm は一般的に使用される golang orm ライブラリであり、非常に便利なページング クエリ メソッドを提供します。組み込みの Limit メソッドと Offset メソッドを使用して、ページング クエリを実装できます。例:

db.Limit(10).Offset(0).Find(&users)

このうち、Limit メソッドは返されるレコード数を表し、Offset メソッドはオフセットを表し、Find メソッドはクエリの実行に使用されます。

次は、gorm ライブラリを使用してページング クエリを実装する方法を示す簡単な例です:

package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
    Id   int
    Name string
    Age  int
}

func main() {
    db, _ := gorm.Open("mysql", "root:123456@/test?charset=utf8mb4&parseTime=True&loc=Local")

    defer db.Close()

    // 创建表
    db.AutoMigrate(&User{})

    // 添加测试数据
    for i := 0; i < 100; i++ {
        user := User{Id: i + 1, Name: fmt.Sprintf("user%d", i+1), Age: i%20 + 10}
        db.Create(&user)
    }

    // 分页查询
    page := 5       // 第5页
    pageSize := 10   // 每页10条记录
    offset := (page - 1) * pageSize // 计算偏移量
    var users []User

    // 查询第5页的记录
    db.Limit(pageSize).Offset(offset).Find(&users)

    // 输出结果
    for _, user := range users {
        fmt.Printf("ID: %d, Name: %s, Age: %d
", user.Id, user.Name, user.Age)
    }
}

上記のコードを実行すると、出力結果は次のようになります:

ID: 41, Name: user41, Age: 10
ID: 42, Name: user42, Age: 11
ID: 43, Name: user43, Age: 12
ID: 44, Name: user44, Age: 13
ID: 45, Name: user45, Age: 14
ID: 46, Name: user46, Age: 15
ID: 47, Name: user47, Age: 16
ID: 48, Name: user48, Age: 17
ID: 49, Name: user49, Age: 18
ID: 50, Name: user50, Age: 19

3ページング ライブラリを使用する ページングの実装

gorm の組み込みページング メソッドを使用することに加えて、サードパーティのページング ライブラリを使用してページングを実装することもできます。例:

  1. paginator

paginator は、mysql、postgres、sqlite3 およびその他のデータベースをサポートする軽量の golang ページング ライブラリです。使い方は非常に簡単で、現在のページ番号、ページごとのレコード数、総レコード数を指定するだけです。以下は例です:

package main

import (
    "fmt"
    "github.com/biezhi/gorm-paginator/pagination"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "github.com/jinzhu/gorm"
)

type User struct {
    Id   uint `gorm:"primary_key"`
    Name string
    Age  uint
}

func main() {
    db,_ := gorm.Open("mysql", "root:123456@/test?charset=utf8mb4&parseTime=True&loc=Local")

    var users []User
    pagination.Paging(&pagination.Param{
        DB:      db,
        Page:    5,
        Limit:   10,
        OrderBy: []string{"id desc"},
        ShowSQL: true,
    }, &users)

    for _, user := range users {
        fmt.Printf("ID: %d, Name: %s, Age: %d
", user.Id, user.Name, user.Age)
    }
}
  1. go-paginator

go-paginator は、データベースに依存せず、非常に使いやすいもう 1 つの軽量の golang ページング ライブラリです。 。以下は例です:

package main

import (
    "fmt"
    "github.com/liyuliang/go-paginator"
)

type User struct {
    Id   uint
    Name string
    Age  uint
}

func main() {
    var users []User
    pageSize := 10                                    // 每页记录数
    page, _ := paginator.New(paginator.Config{        // 初始化分页器
        CurrentPage: 5,                               // 当前页码
        PageSize:    pageSize,                         // 每页记录数
        Total:       100,                              // 总记录数
    })

    records := make([]interface{}, 100)                // 模拟100条记录
    for i := 0; i < 100; i++ {
        user := User{Id: uint(i + 1), Name: fmt.Sprintf("user%d", i+1), Age: uint(i%20 + 10)}
        records[i] = user
    }

    pageData := page.Data(records)                     // 获取分页数据
    offset := (page.CurrentPage - 1) * pageSize         // 计算偏移量
    users = pageData[offset : offset+pageSize].([]User) // 获取当前页的记录

    for _, user := range users {
        fmt.Printf("ID: %d, Name: %s, Age: %d
", user.Id, user.Name, user.Age)
    }
}

ただし、ページング ライブラリでは通常、レコードの総数を手動で計算する必要があり、クエリの効率に影響を与える可能性があることに注意してください。したがって、レコードの総数がそれほど大きくない場合は、ページング ライブラリを使用できず、gorm の組み込みページング メソッドを使用します。

4. ページングの最適化

実際のアプリケーションでは、特にデータ量が多い場合、ページング クエリはパフォーマンスの問題に直面する可能性があります。クエリの効率を向上させるために、次の最適化方法を使用できます。

  1. キャッシュを使用する

データをリアルタイムで更新する必要がない場合、クエリは結果は次回のためにメモリにキャッシュできます。 データベースへの頻繁なアクセスを避けるために、アクセス中にキャッシュからデータを直接取得します。

  1. 返されるフィールドの数を減らす

クエリされたレコードに多数のフィールドが含まれている場合は、大量の不要なデータのクエリを避けるために一部のフィールドのみを返すことができます。 。

  1. インデックスの使用

頻繁にクエリされるフィールドにインデックスを追加すると、クエリの効率が大幅に向上します。

  1. バッチ クエリ

データ量が多い場合、一度に大量のデータをクエリすることを避けるために、バッチ クエリを使用して一度にデータのバッチをクエリできます。非効率を引​​き起こします。

一般に、golang でページング クエリを実装するのは非常に簡単です。組み込みの gorm ライブラリとサードパーティのページング ライブラリを通じて、ページング関数を簡単に実装でき、いくつかの最適化を通じてクエリの効率を向上させることができます。 。

以上がGolang はページングを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:golang または cpp次の記事:golang または cpp