Dengan perkembangan teknologi Internet dan jumlah data yang semakin meningkat, pertanyaan halaman untuk data menjadi semakin biasa. Dalam golang, pertanyaan paging tidak terlalu menyusahkan, dan kecekapan paging boleh dipertingkatkan melalui beberapa pengoptimuman.
1. Paging asas
Dalam golang, cara paling asas untuk pertanyaan paging ialah menggunakan klausa had dalam pernyataan sql. Contohnya:
SELECT * FROM table LIMIT offset, limit;
di mana offset mewakili ofset dan had mewakili bilangan rekod yang dikembalikan. Sebagai contoh, jika 10 keping data dipaparkan pada setiap halaman, maka pernyataan SQL pada halaman 1 ialah:
SELECT * FROM table LIMIT 0, 10;
Pernyataan SQL pada halaman 2 ialah:
SELECT * FROM table LIMIT 10, 10;
Kaedah ini memerlukan pengiraan manual daripada offset setiap halaman Mengukur dan merekodkan kuantiti adalah menyusahkan dan mudah ralat. Oleh itu, kita boleh menggunakan beberapa perpustakaan untuk memudahkan pelaksanaan pertanyaan penomboran.
2. Gunakan perpustakaan gorm untuk melaksanakan paging
gorm ialah perpustakaan orm golang yang biasa digunakan, yang menyediakan kaedah pertanyaan paging yang sangat mudah. Kami boleh menggunakan kaedah Had dan Offset terbina dalam untuk melaksanakan pertanyaan halaman. Contohnya:
db.Limit(10).Offset(0).Find(&users)
Antaranya, kaedah Had mewakili bilangan rekod yang dikembalikan, kaedah Offset mewakili ofset dan kaedah Cari digunakan untuk melaksanakan pertanyaan.
Berikut ialah contoh mudah untuk menunjukkan cara menggunakan perpustakaan gorm untuk melaksanakan pertanyaan paging:
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) } }
Jalankan kod di atas, hasil output ialah:
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 . Gunakan perpustakaan paging Melaksanakan paging
Selain menggunakan kaedah paging terbina dalam gorm, kami juga boleh menggunakan beberapa perpustakaan paging pihak ketiga untuk melaksanakan paging. Contohnya:
paginator ialah perpustakaan paging golang ringan yang menyokong mysql, postgres, sqlite3 dan pangkalan data lain. Ia sangat mudah untuk digunakan, hanya nyatakan nombor halaman semasa, bilangan rekod setiap halaman dan jumlah bilangan rekod. Berikut ialah contoh:
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) } }
go-paginator ialah satu lagi perpustakaan paging golang ringan yang tidak bergantung pada mana-mana pangkalan data dan sangat mudah digunakan . Berikut ialah contoh:
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) } }
Walau bagaimanapun, perlu diingatkan bahawa perpustakaan paging biasanya memerlukan kami mengira jumlah rekod secara manual, yang mungkin menjejaskan kecekapan pertanyaan. Oleh itu, jika jumlah rekod tidak begitu besar, kita tidak boleh menggunakan perpustakaan paging, tetapi gunakan kaedah paging terbina dalam gorm.
4. Pengoptimuman paging
Dalam aplikasi sebenar, pertanyaan paging mungkin menghadapi beberapa masalah prestasi, terutamanya apabila jumlah data adalah besar. Untuk meningkatkan kecekapan pertanyaan, beberapa kaedah pengoptimuman berikut boleh digunakan:
Jika data tidak perlu dikemas kini dalam masa nyata, keputusan pertanyaan boleh dicache dalam ingatan untuk kali seterusnya Dapatkan data terus daripada cache semasa capaian untuk mengelakkan capaian yang kerap kepada pangkalan data.
Jika rekod pertanyaan mengandungi sejumlah besar medan, anda hanya boleh mengembalikan beberapa medan untuk mengelakkan pertanyaan sejumlah besar data yang tidak diperlukan .
Tambahkan indeks pada medan yang sering ditanya, yang boleh meningkatkan kecekapan pertanyaan.
Apabila jumlah data adalah besar, pertanyaan kelompok boleh digunakan untuk menanyakan sekumpulan data pada satu masa untuk mengelakkan pertanyaan terlalu banyak data sekaligus menyebabkan ketidakcekapan.
Secara amnya, sangat mudah untuk melaksanakan pertanyaan paging dalam golang Melalui perpustakaan gorm terbina dalam dan perpustakaan paging pihak ketiga, kami boleh melaksanakan fungsi paging dengan mudah dan boleh meningkatkan kecekapan pertanyaan melalui beberapa pengoptimuman. .
Atas ialah kandungan terperinci Golang melaksanakan paging. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!