0

可能重复:
MySQL 从 600K 行中快速选择 10 个随机行

我有一张包含超过 300,000 条记录的表。我需要从该表中选择 10 或 13 或 20 条记录。

我尝试了以下方法。

这需要很长时间来选择

SELECT * FROM products ORDER BY RAND() LIMIT 0,12

或者

这种方式同样的事情,但我似乎无法选择超过 1 条记录

$temp = mysql_query('SELECT id FROM products limit 0,12');
if ( count( $temp ) > 0 ) {
    $j = 1;
    foreach( $temp as $index => $row ) {
        $p[$j++] = $row[id];
    }
    $my_p= $p[ rand( 1, --$j ) ];
    $pp = 'SELECT id FROM products WHERE id = {$my_p}';
}

更新:按照这个MySQL 从 600K 行中快速选择 10 个随机行

我有

    SELECT * FROM QM_Products AS r1 
JOIN (SELECT (RAND() * (SELECT MAX(id) 
FROM QM_Products )) AS id) AS r2 WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 0, 10 

这工作谢谢大家。

4

2 回答 2

1

试试这个 php 代码

$r = mysql_query("SELECT count(*) FROM user");  
$d = mysql_fetch_row($r);  
$rand = mt_rand(0,$d[0] - 1);  

$r = mysql_query("SELECT username FROM user LIMIT $rand, 1"); 
于 2012-12-25T17:29:09.217 回答
1

您选择使用此解决方案:

SELECT * FROM QM_Products AS r1 
JOIN (SELECT (RAND() * (SELECT MAX(id) 
FROM QM_Products )) AS id) AS r2 WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 0, 10 

但是,我会指出,如果随机表达式返回接近表末尾的 id,您可能会得到少于 10 行。

此外,这不是一个随机选择,因为返回的行将始终具有相邻的 id 值。

除了ORDER BY RAND()解决方案(当然这在大型数据集上表现不佳,因为它不能使用索引),我可以考虑另一种随机选择多行的方法。下面是一些伪 PHP 代码:

// MAX(id) is quicker than COUNT(*) in InnoDB
$maxid = query "SELECT MAX(id) FROM QM_Products"

// generate a list of N random values, making sure they're distinct
$id_list = array();
while (count($idlist) < 10) {
  $rand_id = mt_rand(1,$maxid);
  $id_list[$rand_id] = 1;
}

// convert the id list to a comma-separated string in an SQL query
$id_list = implode(",", array_keys($id_list)); 
$rows = query "SELECT * FROM QM_Products WHERE id IN ($id_list)"

如果随机值在不存在具有匹配 id 的行的间隙中出现,您可能会得到少于 N 行。ORDER BY RAND()但是上述方法比一次对 1 行发出 N 次查询要快得多。因此,您可以设计一个循环来根据需要重复搜索多次以找到 N 行。如果您有非常大的间隙,这不会很好,因为它可能会在找到足够的行之前循环很长时间。

于 2012-12-25T18:22:52.873 回答