簡體   English   中英

postgres:從表中獲取隨機條目 - 太慢了

[英]postgres: get random entries from table - too slow

在我的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()添加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

雖然這給出了正確的結果,但執行時間現在約為2,500毫秒(超過2秒)。 這顯然是不可接受的,因為它是為了在Web應用程序中獲取頁面數據而運行的大量查詢之一。

所以,問題是:如何獲得隨機條目,如上所述,但仍然將執行時間保持在一段合理的時間內(即100毫秒以下是否可以接受)?

當然,它需要在獲得第一行之前根據隨機標准對整個事物進行排序。 也許你可以通過在offset使用random()來解決這個問題?

以下是關於該主題的一些以前的工作可能會有所幫助:

http://blog.rhodiumtoad.org.uk/2009/03/08/selecting-random-rows-from-a-table/

我想你最好先選擇隨機對象,然后在選擇后對這些對象進行連接。 即,查詢一次以選擇隨機對象,然后再次查詢以僅連接所選擇的那些對象。

看起來你的問題是:你有一個250,000行的表,需要兩個隨機行。 因此,您必須生成250,000個隨機數,然后按行數對行進行排序。 兩秒鍾這樣做對我來說似乎相當快。

加速選擇的唯一真正方法是不必提供250,000個隨機數,而是通過索引查找行。

我認為您必須更改表架構以針對此情況進行優化。 怎么樣的:

  • 1)創建一個序列從1開始的新列。
  • 2)每行都有一個number
  • 3)創建索引: number % 1000
  • 4)查詢number % 1000等於0到999之間的隨機數的行(這應該命中索引並加載數據庫的隨機部分)
  • 5)然后,您可以將RANDOM()添加到ORDER BY子句中,然后它將對數據庫的那個塊進行排序,並且速度提高1,000倍。
  • 6)然后選擇這兩行中的前兩行。

如果這仍然不夠隨機(因為行將始終配對具有相同的“散列”),您可能可以執行兩個隨機行的並集,或者在查詢中使用OR子句並生成兩個隨機密鑰。

希望沿着這些方向的東西可以非常快速和隨意地隨機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM