Eine order by
wird immer teuer, besonders wenn der Ausdruck in order by nicht indiziert ist. Also nicht bestellen. Machen Sie stattdessen einen zufälligen Offset in count()
wie in Ihren Abfragen, aber alles auf einmal.
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
Diese Version ist möglicherweise schneller
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