2

根据此链接, ORDER BY RAND() 是无能的

Id考虑到这一点,如果我的(主键)不连续(AKA,我不能这样做,我该如何优化对 mysql 的随机行查询rand(1, max())

4

5 回答 5

4

让表随机排序的最佳方法是添加一个额外的字段并使用任意 md5 散列填充它,然后在该字段上创建一个索引。

这些散列可以是任何你喜欢的散列,只要它们都不同。我建议散列主键 ID 字段,加上任意盐字符串。

UPDATE myTable SET rand_hash = md5(concat(id,'anything here'))

有了这些,你的表就会有一个几乎完全随机的排序顺序。您可以通过创建另一个任意 md5 哈希并查询最接近该值的记录来在随机点查询表。MD5 哈希是随机分布的,因此每条记录都有相同的机会被选中。像这样的东西可以解决问题:

SELECT * FROM myTable WHERE rand_hash >= md5(now()) LIMIT 1

最好的一点是,这将在索引上进行查询,因此无论记录在表中的哪个位置,都会非常快。

希望有帮助。

于 2012-09-03T21:10:11.800 回答
0

您可以使用 mysql_fetch_array() 随机次数

$query=sprintf("SELECT * FROM acb");
$check=mysql_query($query);
for($i=1,$i<=rand($min_id,$max_id,$i++)
$row=mysql_fetch_array($check, MYSQL_ASSOC);

现在 $row 包含一个随机行 注意:这种方法对我来说似乎非常低效

于 2012-09-03T20:29:03.520 回答
0

您可以 ORDER BY id ASC,然后选择 rand() 行或下一个更高的行:

...
WHERE id >= rand(1, $max_id)
ORDER BY id ASC
LIMIT 1
于 2012-09-03T20:19:29.153 回答
0

您可以mysql_data_seek(resource $result, int $row_number)改为在 php 中使用。

$result = mysql_query( 'SELECT * FROM `table`' );
mysql_data_seek( $result , mt_rand( 0 , mysql_num_rows( $result ) ) );

但是mysql_data_seek并且mysql_num_rows不适用于无缓冲的查询。

于 2012-09-03T20:42:44.517 回答
0

我尝试了以下查询。它比 ORDER BY RAND () 更快:

SELECT * FROM table WHERE (id >= RAND() * (SELECT MAX(id) FROM table) LIMIT 1;

如果“id”列是 auto_increment,我测试这个查询比以前快得多:

SELECT * FROM table WHERE (id >= RAND() * (SELECT id FROM table ORDER BY id DESC LIMIT 1)) LIMIT 1;
于 2012-09-03T22:42:32.203 回答