怎么
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自助加入请说明
您可以对查询使用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)
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |