2013-04-26 83 views
1

我有320萬行用幾個鍵來幫助加快排序。然而,隨着桌子的增長,每天事物變得越來越慢。你們可以看看我的查詢,並告訴我有沒有其他解決方案可以讓這個過程更快更好?從3百萬行中選擇Random

SELECT * FROM (SELECT `numbers` FROM `avotf`.`master` WHERE `active`=1 order by `monthly_mins`,`called`,`added`,rand() limit 200) AS T1 ORDER BY RAND() LIMIT 1 
+0

'ORDER BY rand()',這就是問題 – Ejaz 2013-04-26 14:25:07

+0

可能重複[MySQL從600K行中快速選擇10個隨機行](http://stackoverflow.com/q/4329396/1409082)和[獲得隨機結果大表](http://stackoverflow.com/q/12356733/1409082) – Jocelyn 2013-04-27 12:58:03

回答

3

假設你的表有一個數字id列,這樣的事情應該工作(從here借用):

SELECT * FROM `table` 
WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM `table`) ORDER BY id LIMIT 1; 

做到這一點:

SELECT * FROM `table` ORDER BY RAND() LIMIT 1; 

它但它會非常緩慢

0

問題是因爲您使用RAND(),有很多數據

的您應該閱讀揚Kneschke以下博客文章:ORDER BY RAND()

他列出了一些可能的解決方案,其性能表現。

0

衆所周知,ORDER BY RAND()可能非常慢,並且儘管您已嘗試在此選擇一個子查詢,但仍會創建一個臨時表。

您不清楚爲什麼您在子選擇中選擇RAND(),然後忽略此選項並在外部選擇上創建新的排序鍵。也許你可以利用它。

您的ORDER BY條件相當廣泛,如果您在那裏缺少索引,那麼它將進行行掃描以獲取全部條目。

不要忘記EXPLAIN您的查詢。