Aplikasi web sering melakukan penomoran halaman pada data saat ditampilkan kepada pengguna. Pengguna akhir menerima satu halaman hasil, dan ketika mereka menavigasi ke halaman berikutnya, halaman berikutnya kumpulan hasil akan diambil dan disajikan. Halaman ini menjelaskan cara menambahkan penomoran halaman ke hasil penelusuran saat melakukan penelusuran teks lengkap di Spanner.
Ringkasan
Ada dua cara untuk menerapkan kueri yang dipaginasi di Spanner: penomoran halaman berbasis kunci (direkomendasikan) dan penomoran halaman berbasis offset.
Penomoran halaman berbasis kunci adalah metode untuk mengambil hasil penelusuran di tempat yang lebih kecil dan lebih potongan yang dapat dikelola sambil memastikan hasil yang konsisten di seluruh permintaan. Atribut yang unik ID ("kunci") dari hasil terakhir halaman digunakan sebagai referensi untuk mengambil kumpulan hasil berikutnya.
Spanner umumnya merekomendasikan penggunaan penomoran halaman berbasis kunci. Meskipun penomoran halaman berbasis offset lebih mudah diterapkan, karena memiliki dua kekurangannya:
- Biaya kueri yang lebih tinggi:Penomoran halaman berbasis offset berulang kali mengambil dan membuang hasil yang sama, yang menyebabkan peningkatan biaya dan penurunan tingkat tinggi.
- Hasil Tidak Konsisten: Dalam kueri yang dipaginasi, setiap halaman biasanya yang diambil pada stempel waktu baca yang berbeda. Misalnya, laman pertama mungkin kueri berasal dari kueri pada pukul 1 siang, dan kueri berikutnya muncul pada pukul 13:10. Artinya bahwa hasil penelusuran dapat berubah di antara kueri, yang menyebabkan inkonsistensi hasil di seluruh halaman.
Di sisi lain, penomoran halaman berbasis kunci menggunakan ID unik (kunci) dari hasil terakhir laman untuk mengambil kumpulan hasil berikutnya. Hal ini memastikan bahwa pengambilan yang efisien dan hasil yang konsisten, bahkan jika data yang mendasarinya berubah.
Untuk memberikan stabilitas pada hasil halaman, aplikasi dapat mengeluarkan semua kueri
untuk laman yang berbeda
pada stempel waktu yang sama. Namun demikian, proses ini mungkin gagal jika
kueri melebihi retensi versi
titik
(setelan defaultnya adalah 1 jam). Misalnya, kegagalan ini terjadi jika version_gc
satu jam, dan pengguna akhir mengambil hasil pertama pada pukul 13.00 dan mengklik Berikutnya
pada pukul 15.00.
Menggunakan penomoran halaman berbasis kunci
Penomoran halaman berbasis kunci mengingat item terakhir dari halaman sebelumnya dan menggunakannya sebagai
titik awal untuk
kueri halaman berikutnya. Untuk mencapai hal ini, kueri harus mengembalikan
kolom yang ditentukan dalam klausa ORDER BY
dan membatasi jumlah baris
menggunakan LIMIT
.
Agar penomoran halaman berbasis kunci berfungsi, kueri harus mengurutkan hasil menurut beberapa pesanan total. Cara termudah untuk mendapatkannya adalah dengan memilih total urutan, lalu tambahkan kolom, jika diperlukan. Pada umumnya, urutan totalnya adalah urutan indeks penelusuran urutan dan kombinasi kolom yang unik adalah kunci utama tabel dasar.
Dengan menggunakan skema contoh Albums
kami, untuk halaman pertama, kueri akan terlihat seperti
berikut ini:
SELECT AlbumId, ReleaseTimestamp
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, "green")
ORDER BY ReleaseTimestamp DESC, AlbumId
LIMIT @page_size;
AlbumId
adalah pemutus ikatan karena ReleaseTimestamp
bukan kunci. Ada
mungkin dua album yang berbeda dengan nilai yang sama untuk ReleaseTimestamp
.
Untuk melanjutkan, aplikasi akan menjalankan kueri yang sama lagi, tetapi dengan klausa WHERE
yang membatasi hasil dari halaman sebelumnya. Kondisi tambahan
harus memperhitungkan arah kunci (menaik versus turun), pemutus ikatan,
dan urutan nilai NULL untuk kolom nullable.
Dalam contoh kita, AlbumId
adalah satu-satunya kolom kunci (dalam urutan menaik) dan
tidak bisa menjadi NULL, sehingga kondisinya adalah sebagai berikut:
SELECT AlbumId, ReleaseTimestamp
FROM Albums
WHERE (ReleaseTimestamp < @last_page_release_timestamp
OR (ReleaseTimestamp = @last_page_release_timestamp
AND AlbumId > @last_page_album_id))
AND SEARCH(AlbumTitle_Tokens, @p)
ORDER BY ReleaseTimestamp DESC, AlbumId ASC
LIMIT @page_size;
Spanner menafsirkan kondisi seperti ini sebagai seekable (dapat dicari). Hal ini berarti bahwa Spanner tidak membaca indeks untuk dokumen yang Anda filter posisi-posisi ini. Pengoptimalan inilah yang membuat penomoran halaman berbasis kunci jauh lebih efisien daripada penomoran berbasis offset.
Menggunakan penomoran halaman berbasis offset
Penomoran halaman berbasis offset memanfaatkan klausa LIMIT
dan OFFSET
dari kueri SQL
untuk menyimulasikan halaman. Nilai LIMIT
menunjukkan jumlah hasil per halaman.
Nilai OFFSET
ditetapkan ke nol untuk halaman pertama, ukuran halaman untuk halaman kedua
dan dua kali lipat ukuran halaman untuk halaman ketiga.
Misalnya, kueri berikut mengambil halaman ketiga, dengan ukuran halaman 50:
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, "green")
ORDER BY ReleaseTimestamp DESC, AlbumId
LIMIT 50 OFFSET 100;
Catatan Penggunaan:
- Klausa
ORDER BY
sangat direkomendasikan untuk memastikan pengurutan yang konsisten antar halaman. - Dalam kueri produksi, gunakan parameter kueri, bukan konstanta, untuk menentukan
LIMIT
danOFFSET
untuk membuat cache kueri lebih efisien. Untuk selengkapnya informasi, lihat Parameter kueri.
Langkah selanjutnya
- Pelajari cara memberi peringkat hasil penelusuran.
- Pelajari cara melakukan penelusuran substring.
- Pelajari cara menggabungkan kueri teks lengkap dan non-teks.
- Pelajari cara menelusuri beberapa kolom.