Một order by
sẽ luôn đắt tiền, đặc biệt nếu biểu thức theo thứ tự không được lập chỉ mục. Vì vậy, đừng đặt hàng. Thay vào đó, hãy thực hiện một sự bù trừ ngẫu nhiên trong count()
như trong truy vấn của bạn, nhưng hãy thực hiện tất cả cùng một lúc.
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
Phiên bản này có thể nhanh hơn
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