Sebuah order by
akan selalu mahal khususnya jika ekspresi dalam urutan oleh tidak diindeks. Jadi jangan memesan. Sebagai gantinya lakukan offset acak di count()
seperti dalam kueri Anda, tetapi lakukan semuanya sekaligus.
with t as (
select *
from
products p
inner join
images i using (productid)
where
prodtype = $sometype
)
select *
from t
offset floor(random() * (select count(*) from t))
limit 1
Versi ini mungkin lebih cepat
with t as (
select *, count(*) over() total
from
products p
inner join
images i using (productid)
where
prodtype = $sometype
)
select *
from t
offset floor(random() * (select total from t limit 1))
limit 1