MySQL选择随机行 - rand()性能

14

如果说ORDER BY rand()的性能与其他解决方案相比非常慢,那么这是真的吗? 如果是这样,从数据库中选择随机行的更好方法是什么?

我的查询:

SELECT sName FROM bpoint WHERE placeID=? ORDER BY rand() LIMIT 1; 

3
这取决于数据量有多少。我们所说的表有多大? - bestprogrammerintheworld
这也取决于你所说的“随机”是指什么:你是否要求每个记录被等概率选择?或者一个完全均匀的分布并不是必要的吗? - eggyal
5-10,000 行。期望等概率。 - Biker John
1
如果您知道一个索引列包含从ij范围内的值,您可以使用过滤器WHERE column >= FLOOR(i + RAND() * (j – i)) ORDER BY column LIMIT 1。但是,如果存在间隙,则无法获得完全均匀的概率分布... - eggyal
1个回答

14

是的,在较大的结果集中,ORDER BY RAND() 可能会非常慢。

一种选择是使用以下语句(将结果集提取到数组中):

SELECT sName FROM bpoint WHERE placeID=?; 

接下来 - 使用array_rand($resultset)$resultset查询中获取一个随机项。


2
那么,php函数array_rand()更快吗? - Biker John
@JamaicaBob - 这取决于结果集有多大。您的表bpoint中有多少行? - bestprogrammerintheworld
1
@BikerJohn - 这是一个较早的问题,但根据你所使用的编程语言,PHP 有 mt_rand() 函数。我通过快速计算行数,然后使用 $random = mt_rand(1,$count) 来获取范围内的随机整数,接着 SELECT * FROM 'table' WHERE ID = $random; 实现了这个功能。性能数字显著提高。但前提是你必须拥有唯一的 ID(自增长最好!)。 - Wes
@Wes 如果您从表中删除一行,而mt_rand()给您一个不存在的ID会发生什么?您的查询将返回一个空结果集。一个更好的解决方案是保证返回结果: $random = mt_rand(0, $count-1); SELECT * FROM table LIMIT $random, 1; 而且您不需要一个自动递增的字段来使其工作。 - pauk960
那么mysql不好是因为表太大,但是php还可以,为什么?而且这被认为是一种解决方案 - 我很失望。开始学习MySQL,不要走捷径。 - obsergiu
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接