当前位置: 首页 > 面试题库 >

MySQL:选择多个随机行的最有效方法是什么

须峰
2023-03-14
问题内容

我有一个相当大的数据集和一个需要两个联接的查询,因此查询的效率对我来说非常重要。我需要根据联接的结果从数据库中检索3个满足条件的随机行。这里指出最明显的解决方案效率低下,因为

[这些解决方案]需要对所有表进行顺序扫描(因为需要计算与每一行关联的随机值-以便可以确定最小的行),即使对于中等大小的表也可能相当慢。

但是,那里的作者建议的方法SELECT * FROM table WHERE num_value >= RAND() * (SELECT MAX(num_value) FROM table) LIMIT 1其中num_value是ID)对我不起作用,因为某些ID可能会丢失(因为某些行可能已被用户删除)。

那么,在我的情况下,检索3个随机行的最有效方法是什么?

编辑: 解决方案不必是纯SQL。我也使用PHP。


问题答案:

将您的RAND()调用添加到ORDER BY子句中应使您可以忽略ID。试试这个:

SELECT * FROM table WHERE ... ORDER BY RAND() LIMIT 3;

在指出性能问题后,最好的选择是遵循以下方针(利用PHP):

$result = PDO:query('SELECT MAX(id) FROM table');
$max    = $result->fetchColumn();
$ids    = array();
$rows   = 5;

for ($i = 0; $i < $rows; $i++) {
    $ids[] = rand(1, $max);
}

$ids     = implode(', ', $ids);
$query   = PDO::prepare('SELECT * FROM table WHERE id IN (:ids)');
$results = $query->execute(array('ids' => $ids));

此时,您应该可以选择前3个结果。这种方法的唯一问题是处理已删除的行,如果您没有收到至少3个结果,则可能必须撞掉$ rows
var或添加一些逻辑以执行另一个查询。



 类似资料:
  • 问题内容: 我想要在PostgreSQL中随机选择行,我尝试了以下方法: 但是其他一些建议: 我有一个很大的表,有5亿行,我希望它能很快。 哪种方法更好?有什么区别?选择随机行的最佳方法是什么? 问题答案: 根据您的要求(加上注释中的其他信息), 您有一个数字ID列(整数),并且只有很少(或很少有)间隙。 显然没有或只有很少的写操作。 您的ID列必须建立索引!主键很好用。 下面的查询不需要大表的顺

  • 问题内容: 从大型mysql表中选择随机行的快速方法是什么? 我正在使用php,但是我对任何解决方案都感兴趣,即使它是另一种语言也是如此。 问题答案: 获取所有ID,从中随机选择一个ID,然后检索整行。 如果您知道ID是连续无孔的,则只需获取最大值并计算一个随机ID。 如果到处都有孔,但大多数是顺序值,并且您不关心随机偏斜,则获取最大值,计算一个id,然后选择ID等于或大于您所计算的ID的第一行。

  • 问题内容: 我有一种方法,它使用随机样本来近似计算。这种方法被称为数百万次,因此非常重要的是选择随机数的过程必须高效。 我不确定java到底有多快,但是我的程序似乎并没有像我期望的那样受益。 选择随机数时,我将执行以下操作(半伪代码): 现在,这显然具有最坏的最坏情况下的运行时间,因为理论上随机函数可以为永恒添加重复的数字,从而永远停留在while循环中。但是,数字是从{0..45}中选择的,因此

  • 问题内容: 我看到了许多与此主题有关的主题,但在了解如何做到这一点上一直没有成功。 例如,如果我有此表: 并且我只想显示“一个”类中的X个随机行,我该怎么做? 注意 :这是一张大桌子,所以我不想使用。 问题答案: 如您所知,大多数人推荐的解决方案无法扩展到大型表。 我在《SQL反模式:避免数据库编程的陷阱》一书中介绍了该解决方案和其他解决方案。 如果要使用PHP进行此操作,则可以执行以下操作(未测

  • 问题内容: 我正在使用PHP和MySQL创建一个简单的Web应用程序。在其中,我需要以随机顺序从表中随机选择一小组行。如何使用MySQL实现此类目标? 问题答案: SELECT * FROM table ORDER BY RAND() LIMIT 10;

  • 问题内容: 这是我的表结构。在这里我想随机选择4行,所以我在查询中使用RAND()mysql函数,我的问题是 如何配对到行。我的意思是,我想始终选择pid 2和3。我需要按以下顺序。 我不想打破对A2 A3 或或或等 我使用下面的查询,但对我不起作用 问题答案: turbod与他的答案很接近,他只是随机排序,当您似乎想要按pid排序时,在获得所需的随机行以及与A2和A3有关的行之后: