Php 从包含10k+记录的表中选择随机行

Php 从包含10k+记录的表中选择随机行,php,mysql,ruby-on-rails,innodb,Php,Mysql,Ruby On Rails,Innodb,我有一个网站项目,我目前正在编码,我有一个表存储汽车信息。该表包含如下信息,表中大约有20列,我只想知道从一行随机获取所有列数据的最快方法是什么。我知道有一个兰德公司的订单,但我读到它的使用速度很慢,我担心,因为大表,这可能会导致问题,是否有其他选择 我将在InnoDB中使用MySQL,但如果使用替代数据库引擎可以更有效地选择随机行,则可以改变这种情况。该网站将使用PHPPotentially RubyOnRails进行编码,数据库将由一个Python脚本填充,该脚本将删除汽车信息网站 表包含以

我有一个网站项目,我目前正在编码,我有一个表存储汽车信息。该表包含如下信息,表中大约有20列,我只想知道从一行随机获取所有列数据的最快方法是什么。我知道有一个兰德公司的订单,但我读到它的使用速度很慢,我担心,因为大表,这可能会导致问题,是否有其他选择

我将在InnoDB中使用MySQL,但如果使用替代数据库引擎可以更有效地选择随机行,则可以改变这种情况。该网站将使用PHPPotentially RubyOnRails进行编码,数据库将由一个Python脚本填充,该脚本将删除汽车信息网站

表包含以下行:

可携式-

车名 汽车制造商 门牌号 ... ... ...
在Rails中,您可以执行以下操作:

class MyModel < ActiveRecord::Base
  def self.random_record
    find :first, offset: rand(count)
  end
end
如果ORDER BY RAND的性能太慢,可以通过两个查询来实现。首先,做:

SELECT COUNT(*) c FROM CarTable
然后选择一个介于0和c-1之间的随机整数,在PHP中为:

$rownum = rand(0, $c);
然后,执行另一个查询:

SELECT * FROM CarTable
LIMIT :rownum, 1
你可以这样试试

找出表的最大id

 SELECT id FROM car ORDER BY id DESC LIMIT 1;
 -- This result can be cached
计算最小idor仅为1和最大id之间的rand值

$rand_id = mt_rand(1, $max_id);
选择最近的行

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

但若表格有洞,那个么结果就不是真正的随机。但是,我认为,这在你的情况下是正常的。

看看下面的帖子是否回答了你的问题:我想从车中选择MAXid可能是更好的选择,但如果你正在缓存它,那应该不是太大的问题。我认为可能出现的主要问题是,如果我有十条记录,删除记录7和8,并生成一个从0到max10的随机数,当选择7或8时会发生什么?@BratislavaBob,7,8,9会是9。如果你需要真正的随机,你应该使用Barmar解决方案。它将比ORDER BY RAND快,但比my慢。对,此版本将偏向间隙后的元素,与间隙的大小成比例。此解决方案存在性能问题。但是,我认为,对于10k行来说是可以的。它应该比兰德公司的订单要好。它是开着的,而不是在日志上。但是read@sectus但是ORDER BY RAND更糟糕,因为它必须读取每一条记录,而不仅仅是第一个$rownum,并且必须对它们进行排序。为了做得更好,您需要使用带有ROWNUM的DB,但MySQL没有。