从大型数据库表中选择随机行可能具有挑战性。随着表变大,通常建议的 ORDER BY RAND() 方法面临可扩展性问题。
替代方法
一种更具可扩展性的方法涉及利用 MySQL 的本机变量操作和查询串联能力。下面是一个示例:
SET @r := (SELECT FLOOR(RAND() * (SELECT COUNT(*) FROM mytable))); SET @sql := CONCAT('SELECT * FROM mytable LIMIT 1 OFFSET ', @r); PREPARE stmt1 FROM @sql; EXECUTE stmt1;
此技术计算表内的随机偏移量,并使用它来有效地检索单行。
PHP 实现
如果您更喜欢 PHP,您可以实现类似的方法,如下所示(未经测试):
<?php $mysqli->begin_transaction(); $result = $mysqli->query("SELECT COUNT(*) FROM mytable"); $row = $result->fetch_row(); $count = $row[0]; $offset = mt_rand(0, $count); $result = $mysqli->query("SELECT * FROM mytable LIMIT 1 OFFSET $offset"); ... $mysqli->commit(); ?>
通过利用这些技术,您可以有效地从大型 MySQL 表中检索随机行,而不会影响性能。
以上是如何高效地从大型 MySQL 表中检索随机行?的详细内容。更多信息请关注PHP中文网其他相关文章!