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

Permintaan MySQL dengan batas dan offset besar berlangsung selamanya

LIMIT dengan offset sangat lambat di sebagian besar basis data (saya telah menemukan beberapa dokumentasi untuk efek ini untuk MySQL dan saya mencoba mencari artikel yang sangat bagus yang saya baca beberapa waktu lalu menjelaskan ini untuk SQLite). Alasannya adalah karena umumnya diterapkan seperti ini:

  1. Lakukan semua perencanaan kueri normal seolah-olah LIMIT klausa tidak ada
  2. Telusuri hasil hingga kami mendapatkan indeks yang Anda inginkan
  3. Mulai menampilkan hasil

Apa artinya ini jika Anda melakukan LIMIT 10000, 10 , itu akan ditafsirkan sebagai:

  1. Ambil 10.000 hasil pertama dan abaikan
  2. Berikan 10 hasil berikutnya

Ada pengoptimalan sepele di mana Anda setidaknya dapat menggunakan indeks untuk 10.000 hasil pertama karena Anda tidak peduli dengan nilainya, tetapi bahkan dalam kasus itu, database masih perlu menelusuri 10.000 nilai indeks sebelum memberi Anda 10 hasil. Mungkin ada pengoptimalan lebih lanjut yang dapat meningkatkan ini, tetapi dalam kasus umum Anda tidak ingin menggunakan LIMIT dengan offset untuk nilai besar .

Cara paling efisien untuk menangani pagination yang saya ketahui adalah dengan melacak indeks terakhir, jadi jika halaman pertama berakhir pada id = 5 , lalu buat berikutnya link memiliki WHERE id > 5 (dengan LIMIT x tentu saja).

EDIT:Menemukan artikel untuk SQLite . Saya sangat menyarankan Anda membaca ini karena menjelaskan The Right Way™ untuk melakukan sesuatu dalam SQL. Karena orang-orang SQLite sangat pintar dan database lain memiliki masalah yang sama, saya berasumsi MySQL mengimplementasikan ini dengan cara yang sama.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql-connector-java-8.0.12 :mendapatkan kesalahan untuk zona waktu server 'Malay Peninsula Standard Time'

  2. Konversikan situs web PHP/MYSQL/ yang ada ke Aplikasi IOS/Android Asli

  3. MySQL:mengisi bidang kosong dengan nol saat menggunakan GROUP BY

  4. Mencoba membaca kesalahan aliran terakhir di MySQL

  5. Bagaimana menangani sebagian tanggal (2010-00-00) dari MySQL di Django?