В моей базе данных 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 мс)?