Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perbincangan mendalam tentang masalah tidak dapat membelek muka surat dalam golang

Perbincangan mendalam tentang masalah tidak dapat membelek muka surat dalam golang

PHPz
PHPzasal
2023-04-03 11:15:241026semak imbas

Apabila Golang menjadi semakin popular dan digunakan secara meluas, pembangun secara beransur-ansur menyedari bahawa bahasa Golang juga mempunyai beberapa batasan dan batasan. Salah satu daripadanya ialah prestasi Golang semasa melakukan operasi paging Selalunya mustahil untuk membelek halaman. Artikel ini akan menyelidiki isu ini dan menyediakan beberapa penyelesaian.

Mengapa saya tidak boleh membelek halaman?

Di Golang, operasi halaman biasanya dilaksanakan melalui kata kunci LIMIT dan OFFSET bagi pernyataan SQL. LIMIT digunakan untuk menentukan bilangan maksimum baris untuk hasil yang dikembalikan, dan OFFSET digunakan untuk menentukan bilangan permulaan baris untuk hasil pertanyaan. Contohnya:

SELECT * FROM table LIMIT 10 OFFSET 20

Pernyataan SQL ini akan mengembalikan keputusan 20~30 baris dalam jadual.

Walau bagaimanapun, disebabkan oleh ciri bahasa dan mekanisme pelaksanaan Golang, apabila jumlah data adalah besar, menggunakan pernyataan "SELECT *" dan kata kunci OFFSET akan menyebabkan pertanyaan menjadi perlahan atau menyebabkan ralat tamat masa. Ini kerana apabila pemacu pangkalan data Golang menanyakan data, ia terlebih dahulu akan cache semua data dalam ingatan, dan kemudian menapis berdasarkan kata kunci OFFSET dan LIMIT. Oleh itu, apabila jumlah data sangat besar, memori mungkin tidak mencukupi untuk menyimpan semua data, menyebabkan program ranap atau gagal mengembalikan data.

Selain itu, disebabkan ciri-ciri Golang itu sendiri, goroutine perlu digunakan untuk memproses hasil pertanyaan semasa melakukan operasi paging untuk menggunakan sepenuhnya sumber CPU. Walau bagaimanapun, disebabkan oleh had prestasi konkurensi goroutine, apabila jumlah data terlalu besar, hasil pertanyaan mungkin tidak stabil, mengakibatkan kegagalan untuk menyelesaikan operasi membelok halaman.

Penyelesaian

Untuk mengelakkan tidak dapat membelek halaman, kita boleh menggunakan kaedah berikut:

  1. Gunakan fungsi COUNT

Apabila menggunakan kata kunci LIMIT dan OFFSET, kita boleh menggunakan fungsi COUNT untuk mendapatkan jumlah bilangan baris data, dan kemudian mengira bilangan permulaan baris untuk disoal dan bilangan baris yang dikembalikan dalam program. Sebagai contoh, kita boleh menggunakan pernyataan SQL berikut:

SELECT COUNT(*) FROM table

Pernyataan SQL ini akan mengembalikan jumlah bilangan baris dalam jadual data, yang boleh kita simpan sebagai pembolehubah totalCount. Kemudian, kita boleh mengira bilangan permulaan baris dan bilangan baris yang dikembalikan hasil pertanyaan melalui kod berikut:

pageSize := 20      // 每页显示的行数
pageIndex := 1      // 当前页码
startIndex := (pageIndex - 1) * pageSize // 起始行数
resultCount := pageSize          // 返回的行数
if startIndex > totalCount {
    return nil, errors.New("startIndex is greater than totalCount")
}
if (totalCount - startIndex) < pageSize {
    resultCount = totalCount - startIndex
}

Selepas mengira bilangan permulaan baris dan bilangan baris yang dikembalikan, kita boleh gunakan Pernyataan SQL berikut digunakan untuk menanyakan data:

SELECT * FROM table LIMIT resultCount OFFSET startIndex

Menggunakan fungsi COUNT boleh mengurangkan penggunaan memori program dan mengelakkan ralat tamat masa pertanyaan.

  1. Optimumkan pernyataan pertanyaan

Selain itu, kita boleh mengelakkan situasi tidak dapat membuka halaman dengan mengoptimumkan pernyataan pertanyaan. Contohnya, apabila menanyakan sejumlah besar data dalam jadual data, kita boleh membahagikan pernyataan pertanyaan kepada berbilang pernyataan pertanyaan kecil, menanyakan sejumlah data setiap kali, dan kemudian menggabungkan data ini untuk membentuk hasil akhir.

Sebagai contoh, kita boleh menggunakan kod berikut untuk membaca data:

rows, err := db.Query("SELECT * FROM table WHERE id >= ? AND id <= ?", startIndex, endIndex)
defer rows.Close()
if err != nil {
    return nil, err
}
for rows.Next() {
    // 将数据保存到slice中
    // 最终将多个slice合并成一个slice
}

Apabila menanyakan data, dengan menyimpan data setiap pertanyaan ke dalam kepingan, akhirnya berbilang Slices digabungkan menjadi satu slice untuk mengurangkan masa pelaksanaan dan penggunaan memori bagi pernyataan pertanyaan.

  1. Gunakan paging memori

Selain itu, kita juga boleh menggunakan paging memori untuk menyelesaikan masalah tidak dapat membelok muka surat. Apabila menggunakan paging memori, kami menyimpan semua data yang ditanya ke dalam kepingan, dan kemudian mengembalikan data nombor halaman yang ditentukan seperti yang diperlukan. Sebagai contoh, kita boleh menggunakan kod berikut untuk melaksanakan paging memori:

var list []interface{}   // 保存所有数据的slice
for rows.Next() {
    // 将数据保存到slice中
}
totalCount := len(list)  // 总行数
if pageSize * (pageIndex - 1) > totalCount {
    return nil, errors.New("startIndex is greater than totalCount")
}
startIndex := pageSize * (pageIndex - 1)
endIndex := startIndex + pageSize
if endIndex > totalCount {
    endIndex = totalCount
}
return list[startIndex:endIndex], nil   // 返回指定页码的数据

Apabila menggunakan paging memori, kami boleh menggunakan sepenuhnya struktur data Golang seperti kepingan dan tatasusunan untuk melengkapkan operasi membelok halaman dengan lebih cekap .

Ringkasan

Sama ada anda menggunakan fungsi COUNT, mengoptimumkan pernyataan pertanyaan atau menggunakan halaman memori, anda boleh mengelakkan masalah yang mungkin timbul dalam operasi membelok halaman Golang dengan berkesan. Walau bagaimanapun, dalam aplikasi praktikal, kita masih perlu menggabungkan senario dan keperluan tertentu, dan membuat pilihan dan tukar ganti berdasarkan keadaan sebenar. Pada masa yang sama, kami juga perlu terus belajar dan meneroka untuk memberikan permainan sepenuhnya kepada kelebihan dan ciri-ciri bahasa Golang dan menyediakan sokongan yang lebih cekap dan boleh dipercayai untuk kerja pembangunan kami.

Atas ialah kandungan terperinci Perbincangan mendalam tentang masalah tidak dapat membelek muka surat dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn