Een order by
zal altijd duur zijn, vooral als de uitdrukking in de volgorde door niet is geïndexeerd. Niet bestellen dus. Voer in plaats daarvan een willekeurige verschuiving uit in de count()
zoals in uw vragen, maar doe het allemaal tegelijk.
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
Deze versie is mogelijk sneller
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