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

wha*_*ore 2 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
Run Code Online (Sandbox Code Playgroud)

比...快

SELECT * FROM `table` ORDER BY RAND() LIMIT 1
Run Code Online (Sandbox Code Playgroud)

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

*原帖@ 困难MySQL自助加入请说明

Nan*_*nne 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
Run Code Online (Sandbox Code Playgroud)