В моей базе данных postgres у меня есть следующие отношения (упрощенные ради этого вопроса):
Objects (currently has about 250,000 records)
-------
n_id
n_store_object_id (references store.n_id, 1-to-1 relationship, some objects don't have store records)
n_media_id (references media.n_id, 1-to-1 relationship, some objects don't have media records)
Store (currently has about 100,000 records)
-----
n_id
t_name,
t_description,
n_status,
t_tag
Media
-----
n_id
t_media_path
До сих пор так хорошо. Когда мне нужно запросить данные, я запустил это (обратите внимание на limit 2
в конце, как часть требования):
select
o.n_id,
s.t_name,
s.t_description,
me.t_media_path
from
objects o
join store s on (o.n_store_object_id = s.n_id and s.n_status > 0 and s.t_tag is not null)
join media me on o.n_media_id = me.n_id
limit
2
Это отлично работает и возвращает мне две записи, как и ожидалось. Время выполнения при этом составляет около 20 мс - просто отлично.
Теперь мне нужно получить 2 случайных элемента каждый раз, когда выполняется запрос. Я думал, что добавлю order by random()
, например:
select
o.n_id,
s.t_name,
s.t_description,
me.t_media_path
from
objects o
join store s on (o.n_store_object_id = s.n_id and s.n_status > 0 and s.t_tag is not null)
join media me on o.n_media_id = me.n_id
order by
random()
limit
2
Пока это дает правильные результаты, время выполнения составляет около 2500 мс (более 2 секунд). Это явно неприемлемо, так как это один из нескольких запросов, которые нужно запустить для получения данных для страницы в веб-приложении.
Итак, возникает вопрос: как я могу получить случайные записи, как указано выше, но все же сохранить время выполнения в течение некоторого разумного промежутка времени (т.е. менее 100 мс приемлемо для моей цели)?