Select

用於選擇隨機行的推薦數據庫

  • August 11, 2015

我熟悉從 PostgreSQL 的表中選擇隨機行。它真的很慢。我查看了其他一些數據庫,它們似乎都不擅長。主要是因為這不是它們中的任何一個的正常案例。

是否有任何類型的數據庫可以快速選擇隨機行?唯一的硬性要求是它可以安裝在 Linux 上。

到目前為止,我有一個包含 5 億行的表,預計在不久的將來它會增長到幾十億,並且希望能夠選擇一個隨機項目。我還希望能夠在短時間內刪除同一行,因此它需要某種鍵/索引。

現在我的 psql 模式有 3 列:一個文本欄位、一個日期和一個整數序列 ID。日期不重要,不需要在新數據庫中。

我正在使用兩種方法之一來獲取隨機行:

SELECT * FROM mytable ORDER BY RANDOM();

SELECT * FROM mytable LIMIT 1 OFFSET <random number>;

對於低偏移量,偏移方法更快,否則超級慢。100 萬個偏移量大約需要 600 毫秒,而 1 億個是 60 秒(中點偏移量的平均查詢時間為 2.5 分鐘)。對於隨機排序,所有查詢時間約為 5 分鐘。

我最終找到了一個很好的解決方案,類似於 Mat 的評論,但我不需要跟踪有多少行。

我添加了一個名為“randval”的整數列和一個 btree 索引。保存記錄時,我會生成一個介於 1 到 20 億之間的隨機數。遷移現有數據需要一段時間(在慢速硬體上大約需要半天),但現在隨機選擇非常快,使用此查詢通常大約 1 毫秒:

SELECT * FROM mytable WHERE randval >= <random number> ORDER BY randval LIMIT 1;

有 5 億行,並不是每個隨機數都有一個值,因此 order by with limit 為我們提供了下一個最接近的行,並且索引使其快速,平均 2.5 分鐘的查詢速度提高了 150,000 倍。

數據庫不喜歡做隨機的事情,但它們確實在恰好具有隨機值的特定事情上做得很好。

引用自:https://dba.stackexchange.com/questions/108637