簡體   English   中英

根據需求從50k行表中選擇一個隨機行。 太慢了。 我如何加快速度?

[英]Select a random row based on a requirement from 50k rows table. Too slow. How can I speed it up?

我有一張約有5萬行的表格。 有一個名為status的列。 它的值可以是01 我需要獲取status = 0的隨機行。

SELECT * FROM table WHERE status = 0 ORDER BY RAND() LIMIT 1顯然太慢。

所以,我做了什么,到目前為止是,讓有行量的計數status = 0使用SELECT COUNT(status) FROM table WHERE status = 0

現在,我有209行的status = 0 ,但是如何處理這些行呢?

我想訂購這209行,並讓我的php腳本獲得介於0和209之間的隨機行號,但是我不確定如何實現。

你有嘗試過嗎?

SELECT t.*
FROM table t
WHERE status = 0
ORDER BY RAND()
LIMIT 1;

排序209應該很快。

編輯:

有效地獲取隨機值具有挑戰性。 如果在table(status)上有索引,則可以嘗試這樣的方法:

SELECT t.*
FROM table t cross join
     (select count(*) as allcnt from table where status = 0) const
WHERE status = 0 and
      RAND() < 10/allcnt
ORDER BY RAND()
LIMIT 1;

where子句中的rand()相當快( RAND()很快,排序很慢)。 它應該將行數大大減少到期望值10-這意味着您幾乎可以肯定在運行時會得到一行(我認為是99.99 +%)。 這也比可變方法簡單。

變量方法涉及一個子查詢,該子查詢在讀取和寫入派生表時會產生自身的開銷。 想法是枚舉行,然后隨機選擇一個索引:

SELECT t.*
FROM (select t.*, @rn := @rn + 1 as rn
      from table t cross join
           (select @rn := 0, @rand := rand()) const
      where status = 0
     ) t cross join
     (select count(*) as allcnt from table where status = 0) const
WHERE floor(1 + @rand * const.allcnt) = rn;

我知道這需要兩個查詢,但是您可以嘗試一下並對其進行基准測試:獲取與status = 0匹配的行的總數,從PHP獲取一個介於0和number-1之間的隨機數,並使用限制1和php生成的隨機值的偏移量。

暫無
暫無

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

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