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().