从具有10k +记录的表中选择随机行

时间:2013-05-23 00:03:58

标签: php mysql ruby-on-rails innodb

我有一个我正在编码的网站项目,我有一个存储汽车信息的表格。该表有如下信息,表中大约有20列,我只想知道从一行中随机获取所有列数据的最快方法。我知道有一个“ORDER BY RAND()”,但我读过它使用起来很慢,我担心因为这可能会导致问题的大表,是否有其他选择。

我将在InnoDB中使用MySQL,但如果使用备用数据库引擎选择随机行可以更有效地完成,则可以更改。该网站将使用PHP(潜在的RubyOnRails)进行编码,数据库将从Python脚本中填充,这将填补汽车信息网站。

表包含

等行

CarTable -

  • 车名
  • 汽车制造商
  • 门号
  • ...
  • ...
  • ...

3 个答案:

答案 0 :(得分:1)

如果ORDER BY RAND()的效果太慢,您可以使用两个查询来执行此操作。首先,做:

SELECT COUNT(*) c FROM CarTable

然后在PHP中选择0和c-1之间的随机整数:

$rownum = rand(0, $c);

然后,再做一次查询:

SELECT * FROM CarTable
LIMIT :rownum, 1

答案 1 :(得分:1)

你可以这样试试。

找出你最大的表格。

 SELECT id FROM car ORDER BY id DESC LIMIT 1;
 -- This result can be cached

计算最小id(或仅1)和最大id之间的rand值。

$rand_id = mt_rand(1, $max_id);

选择最近的行。

SELECT * FROM `car` WHERE id >= ? ORDER BY id LIMIT 1;

但如果表有“漏洞”,结果将不是“真随机”。但是,我认为,这在你的情况下是正常的。

答案 2 :(得分:0)

在Rails中,你可以这样做:

class MyModel < ActiveRecord::Base
  def self.random_record
    find :first, offset: rand(count)
  end
end