"Batas 1000,25" vs "batas 25 Offset 1000"

11

Baru-baru ini saya mengetahui bahwa MySQL memiliki offsetfitur. Saya sudah mencoba mencari dokumentasi tentang hasil offset, atau perbedaan antara offset dan varian batas, tetapi sepertinya saya tidak dapat menemukan apa yang saya cari.

Katakanlah saya memiliki 10.000 baris dalam sebuah tabel dan saya ingin 25 hasil, dari baris 1.000. Sejauh yang saya dapat sejauh ini, saya bisa melakukan keduanya untuk mendapatkan hasil yang sama:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Yang ingin saya ketahui adalah perbedaan di antara keduanya.

  • Apakah ini benar-benar melakukan hal yang sama atau apakah pemahaman saya salah?
  • Apakah satu lebih lambat / lebih cepat di tabel yang lebih besar
  • Apakah hasil perubahan offset ketika saya melakukannya WHERE column=1(katakanlah kolom memiliki> 100 nilai yang berbeda)
  • Apakah hasil perubahan offset ketika saya lakukan ORDER BY column ASC(dengan asumsi memiliki nilai acak)

Jika ini adalah pertanyaan 'bodoh' dan seseorang mengetahui dokumentasi apa pun yang menerangi subjek, harap tambahkan dalam balasan.
Saya memiliki perasaan offset melompati baris X pertama yang ditemukan dalam database, mengabaikan penyortiran dan di mana.

Martijn
sumber
Dokumentasi MySQL menjelaskan ini dengan sempurna. Apakah ada alasan mengapa Anda tidak tertarik melihatnya sendiri?
siride
1
"Untuk kompatibilitas dengan PostgreSQL, MySQL juga mendukung LIMIT row_count OFFSET offset syntax." (dari dev.mysql.com/doc/refman/5.5/id/select.html ).
siride
Karena ini masih belum menjawab pertanyaan saya. Dari kutipan Anda (dan teks mereka di halaman) saya harus menyimpulkan bahwa offset adalah hal yang sama dengan batas, hanya ditulis berbeda, seolah-olah LIMIT adalah pemilih steno?
Martijn
1
itu sintaks yang berbeda untuk mengekspresikan hal yang sama. Sub pertanyaan Anda yang lain sama sekali berbeda dari judul dan bagian pertama dari posting Anda.
siride
1
Saya mengerti bahwa jika itu adalah hal yang sama, pertanyaan lain tidak akan terpengaruh secara berbeda dalam situasi yang manapun. Saya hanya tidak yakin itu adalah hal yang sama, itulah jawaban yang saya cari, terima kasih.
Martijn

Jawaban:

9

Dalam hal operasi

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

sama sekali tidak ada perbedaan dalam pernyataan

Komentar @ siride adalah intinya.

LIMIT 1000,25 cara LIMIT 25 OFFSET 1000

Dari Dokumentasi yang sama

LIMIT row_count setara dengan LIMIT 0, row_count

PERTANYAAN AKTUAL ANDA

  • Apakah ini benar-benar melakukan hal yang sama atau apakah pemahaman saya salah?
  • Apakah satu lebih lambat / lebih cepat di tabel yang lebih besar

Karena kedua kueri itu sama, tidak ada perbedaan

  • Apakah hasil perubahan offset ketika saya melakukan WHERE kolom = 1 (katakanlah kolom memiliki> 100 nilai yang berbeda)
  • Apakah hasil dari perubahan offset ketika saya melakukan ORDER BY kolom ASC (dengan asumsi nilai acak)

Menggunakan LIMITtidak mengubah set hasil apa pun. Mereka hanya menavigasi dalam set hasil.

Kueri ini

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

akan berbeda dari

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

karena LIMIT sedang diterapkan pada tahap yang berbeda.

Kueri pertama tidak menghasilkan apa-apa jika tablename memiliki kurang dari 1000 baris

Permintaan kedua tidak menghasilkan apa-apa jika subquery memiliki kurang dari 1000 baris

KESIMPULAN

Anda harus memahat kueri untuk memastikan Anda mengurutkan data pada tahap yang tepat

RolandoMySQLDBA
sumber
1
Terima kasih. Ini: "Sama sekali tidak ada perbedaan dalam pernyataan" adalah persis apa yang saya cari, dan dengan sedikit info saya bisa melihat penyortiran itu atau di mana tidak masalah. Tidak yakin tentang apakah itu hal yang sama, dan dalam pengkodean iblis ada dalam detail, saya ingin tahu pasti :)
Martijn