Um
order by
sempre será caro, especialmente se a expressão na ordem por não estiver indexada. Então não peça. Em vez disso, faça um deslocamento aleatório no count()
como em suas consultas, mas faça tudo de uma vez. 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
Esta versão pode ser mais rápida
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