Klausa LIMIT dapat digunakan untuk membatasi jumlah baris yang dikembalikan oleh pernyataan SELECT. LIMIT mengambil satu atau dua argumen numerik, yang keduanya harus berupa konstanta integer nonnegatif (kecuali saat menggunakan pernyataan yang disiapkan).
Dengan dua argumen, argumen pertama menentukan offset dari baris pertama untuk kembali, dan argumen kedua menentukan jumlah maksimum baris untuk kembali. Offset baris awal adalah 0 (bukan 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Untuk mengambil semua baris dari offset tertentu hingga akhir set hasil, Anda dapat menggunakan sejumlah besar untuk parameter kedua. Pernyataan ini mengambil semua baris dari baris ke-96 ke baris terakhir:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Dengan satu argumen, nilai menentukan jumlah baris yang akan dikembalikan dari awal set hasil:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
Dengan kata lain, LIMIT row_count setara dengan LIMIT 0, row_count.
limit X, Y
, apa yang terjadi adalah bahwa baris X + Y diambil dan kemudian Baris X dari awal dijatuhkan dan apa pun yang tersisa dikembalikan. Untuk mengulangi:limit X, Y
hasil dalam pemindaian baris X + Y.OFFSET
;-)Untuk 500 rekaman, efisiensi mungkin bukan masalah, tetapi jika Anda memiliki jutaan catatan, maka akan menguntungkan jika menggunakan klausa WHERE untuk memilih halaman berikutnya:
"234374" di sini adalah id dari catatan terakhir dari halaman sebelumnya yang Anda lihat.
Ini akan memungkinkan indeks id digunakan untuk menemukan catatan pertama. Jika Anda menggunakan
LIMIT offset, 20
Anda bisa menemukan bahwa itu semakin lambat ketika halaman Anda menuju akhir. Seperti yang saya katakan, mungkin tidak masalah jika Anda hanya memiliki 200 catatan, tetapi dapat membuat perbedaan dengan set hasil yang lebih besar.Keuntungan lain dari pendekatan ini adalah bahwa jika data berubah di antara panggilan Anda tidak akan kehilangan catatan atau mendapatkan catatan berulang. Ini karena menambah atau menghapus baris berarti offset semua baris setelah itu berubah. Dalam kasus Anda, ini mungkin tidak penting - saya kira kumpulan iklan Anda tidak terlalu sering berubah dan tidak ada yang akan melihat jika mereka mendapatkan iklan yang sama dua kali berturut-turut - tetapi jika Anda mencari "cara terbaik" maka ini adalah hal lain yang perlu diingat ketika memilih pendekatan mana yang akan digunakan.
Jika Anda ingin menggunakan LIMIT dengan offset (dan ini diperlukan jika pengguna menavigasi langsung ke halaman 10000 alih-alih membuka halaman satu per satu) maka Anda dapat membaca artikel ini tentang pencarian baris terakhir untuk meningkatkan kinerja LIMIT dengan besar mengimbangi.
sumber
limit 1000000, 10
dan berharap bahwa itu akan berhasil tidak akan membawa Anda ke mana pun.area=width*height
sehingga tidak hanya kuantitas catatan yang mungkin penting, tetapi ukuran setiap record juga merupakan faktor ketika menyimpan hasil dalam memoriTentukan OFFSET untuk kueri. Sebagai contoh
halaman 1 - (catatan 01-10): offset = 0, batas = 10;
halaman 2 - (catatan 11-20) offset = 10, batas = 10;
dan gunakan permintaan berikut:
contoh untuk halaman 2:
sumber
Ada literatur tentang hal itu:
Dioptimalkan Pagination menggunakan MySQL , membuat perbedaan antara menghitung jumlah total baris, dan pagination.
Pagination Efisien Menggunakan MySQL , oleh Yahoo Inc. dalam Percona Performance Conference 2009. Tim MySQL Percona menyediakannya juga sebagai video Youtube: Pagination Efisien Menggunakan MySQL (video) ,
Masalah utama terjadi dengan penggunaan besar
OFFSET
. Mereka menghindari penggunaanOFFSET
dengan berbagai teknik, mulai dariid
pilihan rentang dalamWHERE
klausa, hingga semacam caching atau halaman pra-komputasi.Ada solusi yang disarankan di Use the INDEX, Luke :
" Paging Melalui Hasil ".
" Pagination dilakukan dengan cara yang benar ".
sumber
Tutorial ini menunjukkan cara hebat untuk melakukan pagination. Pagination yang Efisien Menggunakan MySQL
Singkatnya, hindari menggunakan OFFSET atau LIMIT besar
sumber
Anda juga bisa melakukannya
Hitungan baris dari pernyataan pilih (tanpa batas) ditangkap dalam pernyataan pilih yang sama sehingga Anda tidak perlu menanyakan ukuran tabel lagi. Anda mendapatkan jumlah baris menggunakan SELECT FOUND_ROWS ();
sumber
*
hasil lebih kolom dari makhluk yang diperlukan diambil, danSQL_CALC_FOUND_ROWS
hasil dalam kolom tersebut sedang dibaca dari semua baris dalam tabel, meskipun mereka tidak termasuk dalam hasil. Akan jauh lebih efisien untuk menghitung jumlah baris dalam kueri terpisah yang tidak membaca semua kolom itu. Maka permintaan utama Anda dapat berhenti setelah membaca 20 baris.Pertanyaan 1:
SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500
Pertanyaan 2:
SELECT * FROM tbl LIMIT 0,500;
Kueri 1 berjalan lebih cepat dengan catatan kecil atau menengah, jika jumlah catatan sama dengan 5.000 atau lebih tinggi, hasilnya serupa.
Hasil untuk 500 catatan:
Kueri1 ambil 9,9999904632568 milidetik
Kueri2 ambil 19,999980926514 milidetik
Hasil untuk 8.000 catatan:
Kueri1 ambil 129,99987602234 milidetik
Kueri2 ambil 160.00008583069 milidetik
sumber
id
.id > 0
berguna?offset
(argumen pertama untuk membatasi diimbangi), Anda masih memilih semua data ke batas, lalu membuang jumlah offset itu, lalu mengembalikan bagian yang berada di antaraoffset
danlimit
. denganwhere
klausa di sisi lain, Anda menetapkan semacam titik awal untuk kueri dan memintaONLY
bagian tertentu.Paging sederhana ketika mengambil data dari satu tabel tetapi rumit ketika mengambil data yang bergabung dengan beberapa tabel. Berikut adalah contoh yang baik dengan MySql dan Spring:
https://www.easycodeforall.com/zpagination1.jsp
sumber