怎么样
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
我实际上无法理解第一个。也许如果我知道为什么一个比另一个快,我会更好地理解。
答案 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