2011-01-19 38 views
2

只使用RAND()更快如何比如何使用加入比MySQL的

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

其實我無法理解第一更快

SELECT t.id 
FROM table t 
JOIN (SELECT(FLOOR(max(id) * rand())) AS maxid FROM table) 
AS tt 
ON t.id >= tt.maxid 
LIMIT 1 

。也許如果我知道一個人比另一個人快,我會有更好的理解。

*原帖@Difficult MySQL self-join please explain

回答

6

您可以使用EXPLAIN的查詢,但基本上是:

在第一你得到一個隨機數(這是不是很慢)的基礎上, (我假定)索引字段的最大值。這很快,我可能會說甚至接近恆定的時間(取決於索引散列的實現)

然後,你加入這個數字,只返回第一行,你再次使用索引,這是閃電般的。

第二是按一些隨機函數排序。這必須,但你需要看看解釋,做一個完整的表掃描,然後返回第一個。這是當然非常昂貴。因爲那個rand,你沒有使用任何索引。

(該說明會這個樣子,可見你不使用鍵)

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE table ALL NULL NULL NULL NULL 14 Using temporary; Using filesort 
+0

謝謝! (你知道我在哪裏可以找到MySQL命令的時間 - 成本總結?) – whamsicore 2011-01-19 11:51:43