如何使用Join比在MySQL中使用Rand()更快

时间:2011-01-19 08:09:39

标签: mysql

怎么样

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

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

我实际上无法理解第一个。也许如果我知道为什么一个比另一个快,我会更好地理解。

*原帖@ Difficult MySQL self-join please explain

1 个答案:

答案 0 :(得分:6)

您可以对查询使用EXPLAIN,但基本上是:

在第一个中你得到一个随机数(不是很慢),基于一个(我推测)索引字段的最大值。这很快,我说甚至可能是接近恒定的时间(取决于索引哈希的实现?)

然后你加入那个号码,只返回那个比那个更大的第一行,因为你再次使用索引,这很快就会闪现。

第二种是通过一些随机函数排序。这必须,但是您需要查看解释,执行FULL TABLE扫描,然后返回第一个。这是非常昂贵的。由于兰特,你没有使用任何索引。

(解释将如下所示,表明您没有使用密钥)

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