Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

mySQL - Paginasi baris yang difilter

Anda tidak dapat mengetahui apa id pertama pada halaman tertentu, karena nomor id tidak harus berurutan. Dengan kata lain, mungkin ada celah dalam urutannya, jadi baris pada halaman kelima dari 100 baris tidak harus dimulai dari id 500. Itu bisa dimulai pada id 527 misalnya, tidak mungkin untuk diketahui.

Dinyatakan dengan cara lain:id adalah nilai, bukan nomor baris.

Salah satu solusi yang mungkin jika klien Anda maju melalui halaman dalam urutan menaik adalah bahwa setiap permintaan REST mengambil data, catat terbesar nilai id pada halaman itu, lalu gunakan itu di berikutnya REST request sehingga menanyakan nilai id yang lebih besar.

SELECT ... FROM ... WHERE filterKey = filterValue 
AND id > id_of_last_match_of_previous_page

Tetapi jika permintaan REST Anda dapat mengambil halaman acak apa pun, solusi ini tidak berfungsi. Itu tergantung pada apakah halaman sebelumnya sudah diambil.

Solusi lain adalah dengan menggunakan LIMIT <x> OFFSET <y> sintaksis. Ini memungkinkan Anda untuk meminta halaman sembarang. LIMIT <y>, <x> bekerja sama, tetapi untuk beberapa alasan x dan y dibalik dalam dua bentuk sintaks yang berbeda, jadi ingatlah itu.

Menggunakan LIMIT...OFFSET sangat tidak efisien ketika Anda meminta halaman yang banyak halaman menjadi hasil. Katakanlah Anda meminta halaman ke-5000. MySQL harus menghasilkan hasil di sisi server sebanyak 5.000 halaman, kemudian membuang 4.999 di antaranya dan mengembalikan halaman terakhir dalam hasil tersebut. Maaf, tapi begitulah cara kerjanya.

Kembali komentar Anda:

Anda harus memahami bahwa WHERE menerapkan ketentuan pada nilai dalam baris, tetapi halaman ditentukan oleh posisi dari baris. Ini adalah dua cara berbeda untuk menentukan baris!

Jika Anda memiliki kolom yang dijamin sebagai nomor baris , maka Anda dapat menggunakan nilai itu seperti posisi baris. Anda bahkan dapat meletakkan indeks di dalamnya, atau menggunakannya sebagai kunci utama.

Tetapi nilai kunci utama dapat berubah, dan mungkin tidak berurutan, misalnya jika Anda memperbarui atau menghapus baris, atau mengembalikan beberapa transaksi, dan seterusnya. Penomoran ulang nilai kunci utama adalah ide yang buruk karena tabel lain atau data eksternal mungkin merujuk nilai kunci utama.

Jadi Anda bisa menambahkan kolom lain yang bukan kunci utama, tetapi hanya nomor baris.

ALTER TABLE MyTable ADD COLUMN row_number BIGINT UNSIGNED, ADD KEY (row_number);

Kemudian isi nilainya saat Anda perlu memberi nomor ulang baris.

SET @row := 0;
UPDATE MyTable SET row_number = (@row := @row + 1) ORDER BY id;

Anda harus memberi nomor ulang baris jika Anda pernah menghapus beberapa, misalnya. Tidak efisien untuk sering melakukannya, tergantung pada ukuran tabel.

Juga, sisipan baru tidak dapat membuat nilai nomor baris yang benar tanpa mengunci tabel. Ini diperlukan untuk mencegah kondisi balapan.

Jika Anda memiliki jaminan bahwa row_number adalah urutan nilai yang berurutan, lalu merupakan nilai dan posisi baris, sehingga Anda dapat menggunakannya untuk pencarian indeks performa tinggi untuk halaman baris mana pun.

SELECT * FROM MyTable WHERE row_number BETWEEN 401 AND 500;

Setidaknya sampai waktu berikutnya urutan nomor baris diragukan dengan penghapusan atau penyisipan baru.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. implikasi keamanan dari pengaturan grup keamanan mysql aws

  2. MySQL pilih untuk pembaruan mengembalikan set kosong meskipun ada baris

  3. Menghitung semua posting yang termasuk dalam kategori DAN subkategorinya

  4. Bagaimana meningkatkan kinerja INSERT pada tabel MySQL yang sangat besar

  5. Memcache - menyimpan hasil mysql