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

Mengoptimalkan kueri ORDER BY RAND() yang lambat

ORDER BY RAND() lambat karena DBMS harus membaca semua baris, mengurutkan semuanya, hanya untuk menyimpan beberapa baris saja. Jadi kinerja kueri ini sangat bergantung pada jumlah baris dalam tabel, dan menurun seiring bertambahnya jumlah baris.

Tidak ada cara untuk mengoptimalkannya.

Namun, ada alternatif:

Anda dapat menerapkan "dapatkan 5 baris acak" dengan melakukan 6 pertanyaan:

  • dapatkan jumlah baris dalam tabel (Anda dapat menyimpan yang ini dalam cache)
  • lakukan 5 kueri dengan OFFSET <random offset from 0 to $number_of_rows-1> LIMIT 1 (yaitu membaca dan mengembalikan hanya satu baris dari beberapa offset acak)

    Misalnya:SELECT * FROM Products OFFSET 42 LIMIT 1 (catatan:tanpa bergabung, untuk saat ini)

    Kueri semacam itu sangat cepat dan berjalan dalam waktu yang hampir tidak bergantung pada ukuran tabel.

Ini seharusnya banyak lebih cepat dari ORDER BY RAND() .

Sekarang, untuk mendapatkan Gambar acak untuk setiap Produk acak:

SELECT *
FROM (
    SELECT *
    FROM Products
    OFFSET 42 LIMIT 1
) p
JOIN ProductImages pi
ON   pi.product_id = p.id
ORDER BY RAND()
LIMIT 1

Permintaan bagian dalam masih cepat, dan bagian luar hanya mengurutkan beberapa baris (dengan asumsi ada beberapa gambar per produk), sehingga masih dapat menggunakan pesanan dengan rand().




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menyimpan nomor telepon di database MySQL?

  2. Pernyataan MySQL ke tabel pivot tanpa menggunakan fungsi pivot atau gabungan

  3. Apakah pemicu BEFORE INSERT dieksekusi untuk setiap baris yang dimasukkan pada kueri pembaruan kunci duplikat?

  4. Tampilkan hasil kueri SQL di php

  5. Perilaku aneh dengan mysql_affected_rows() di PHP